Portál AbcLinuxu, 13. července 2025 23:43


Dotaz: Propojeni 2 tabulek v PHP

24.10.2008 20:03 Tomyx007
Propojeni 2 tabulek v PHP
Přečteno: 557×
Odpovědět | Admin
Prosim o radu, jak jednoduse propojit v PHP dve tabulky "polls" (se sloupci: ID_pollu,ID_Candidate1, ID_Candidate2, ID_Candidate3, ID_Candidate4,Votes1,Votes2,Votes3,Votes4) a tabulku "candidates" (se sloupci:ID, Prijmeni). Kde vzdy kazdemu ID_Candidate (v tabulce "polls") odpovida jedno ID (v tabulce "candidates"). Cilem je vypsat prijmeni kandidatu (z tabulky "candidates") a jim odpovidajici hlasy (Votes z tabulky "polls"). Ted jsem to resil slozitym zpusobem: $vysledek=mysql_query("SELECT * FROM polls where id='$idpoll'"); $zaznam=mysql_fetch_array($vysledek);

$vysledek2=mysql_query("SELECT * FROM candidates where id='".$zaznam['ID_Candidate1']."'"); $zaznam2=mysql_fetch_array($vysledek2); $data['0']['prijmeni'] = $zaznam2['Prijmeni'];

$vysledek3=mysql_query("SELECT * FROM candidates where id='".$zaznam['ID_Candidate2']."'"); $zaznam3=mysql_fetch_array($vysledek3); $data['1']['prijmeni'] = $zaznam3['Prijmeni'];

$vysledek4=mysql_query("SELECT * FROM candidates where id='".$zaznam['ID_Candidate3']."'"); $zaznam4=mysql_fetch_array($vysledek4); $data['2']['prijmeni'] = $zaznam4['Prijmeni'];
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

24.10.2008 21:24 Petr Svoboda | skóre: 13 | blog: * | Příbram
Rozbalit Rozbalit vše Re: Propojeni 2 tabulek v PHP
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebudu zabíhat do zbytečných detailů. Zkusil bych cosi jako
SELECT * FROM polls p, candidates c1, candidates c2
WHERE p.ID = $idpoll AND p.ID_Candidate1 = c1.ID AND p.ID_Candidate2 = c2.ID
S dovolením jsem vynechal 3. a 4. kandidáta, ale jak je přidat je snad zřejmé.

Nicméně bych se spíš zkusil zamyslet nad změnou schématu (pokud je to možné). Asi bych zvolil něco jako: Je to výrazně flexibilnější, na druhou stranu budou složitější inserty.

Select by pak mohl být nějak takto:
SELECT * FROM votes v, candidates c
WHERE v.id_poll = $idpoll AND v.id_candidate = c.id
26.10.2008 11:50 Tomyx007
Rozbalit Rozbalit vše Re: Propojeni 2 tabulek v PHP
Dekuji za odpoved - fungule to. Slo by jetse nejak resit, pokud ma v tabulce "polls" nektery napr. sloupec ID_Candidate3 hodnotu 0 (stejne tak sloupec Votes3 ma 0), tak dotaz nevypise zadny zaznam, kdyz se zmeni podminka z AND na OR, tak se jich vypise zase mnoho, slo by toto nejka resit?
default avatar 26.10.2008 14:53 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Propojeni 2 tabulek v PHP
Příloha:
Předpokládám, že hodnotou nula (0) řešíš nepovinnou vazbu. Od toho je NULL a naštěstí to jde velice jednoduše opravit ;-) Předpokládám testovací data z přílohy. Předtím, než nahodíme referenční integritu, musíme data pročistit.

Před vlastní modifikací jen povolíme NULL hodnoty:
ALTER TABLE polls MODIFY id_candidate1 NULL
/

ALTER TABLE polls MODIFY id_candidate2 NULL
/

ALTER TABLE polls MODIFY id_candidate3 NULL
/

ALTER TABLE polls MODIFY id_candidate4 NULL
/
Pak nastavíme neplatné klíče na NULL:
UPDATE polls p
SET
    p.id_candidate1 = NULL
WHERE
    NOT EXISTS (SELECT
            1
        FROM
            candidates cc
        WHERE
            cc.id = p.id_candidate1)
/

UPDATE polls p
SET
    p.id_candidate2 = NULL
WHERE
    NOT EXISTS (SELECT
            1
        FROM
            candidates cc
        WHERE
            cc.id = p.id_candidate2)
/

UPDATE polls p
SET
    p.id_candidate3 = NULL
WHERE
    NOT EXISTS (SELECT
            1
        FROM
            candidates cc
        WHERE
            cc.id = p.id_candidate3)
/

UPDATE polls p
SET
    p.id_candidate4 = NULL
WHERE
    NOT EXISTS (SELECT
            1
        FROM
            candidates cc
        WHERE
            cc.id = p.id_candidate4)
/

COMMIT
/
Poté nahoíme referenční integritu:
ALTER TABLE candidates ADD CONSTRAINT pk_candidates PRIMARY KEY (id)
/

ALTER TABLE polls ADD CONSTRAINT fk_vote_candidate1 FOREIGN KEY (id_candidate1) REFERENCES candidates (id)
/

ALTER TABLE polls ADD CONSTRAINT fk_vote_candidate2 FOREIGN KEY (id_candidate2) REFERENCES candidates (id)
/

ALTER TABLE polls ADD CONSTRAINT fk_vote_candidate3 FOREIGN KEY (id_candidate3) REFERENCES candidates (id)
/

ALTER TABLE polls ADD CONSTRAINT fk_vote_candidate4 FOREIGN KEY (id_candidate4) REFERENCES candidates (id)
/
Každopádně: ve všech případech funguje tento SELECT statement:
SELECT
    c1.prijmeni AS candidate1_surname,
    p.votes1 AS candidate1_votes,
    c2.prijmeni AS candidate2_surname,
    p.votes2 AS candidate2_votes,
    c3.prijmeni AS candidate3_surname,
    p.votes3 AS candidate3_votes,
    c4.prijmeni AS candidate4_surname,
    p.votes4 AS candidate4_votes
FROM
    polls p
        LEFT JOIN candidates c1 ON (p.id_candidate1 = c1.id)
        LEFT JOIN candidates c2 ON (p.id_candidate2 = c2.id)
        LEFT JOIN candidates c3 ON (p.id_candidate3 = c3.id)
        LEFT JOIN candidates c4 ON (p.id_candidate4 = c4.id)
/
Tak hodně štěstí. (V příloze máš kompletní skript na hraní.)
26.10.2008 20:34 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Propojeni 2 tabulek v PHP
k joinom ... teda neviem ako mysql, ale nechýba ti tam outer ?
default avatar 26.10.2008 20:46 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Propojeni 2 tabulek v PHP
LEFT OUTER JOIN a LEFT JOIN jsou ekvivalentní. Klíčové slovo OUTER je nepovinné, protože LEFT nebo RIGHT JOIN je vždy "OUTER".
default avatar 26.10.2008 14:24 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Propojeni 2 tabulek v PHP
Odpovědět | | Sbalit | Link | Blokovat | Admin
A co takhle?
SELECT
    c1.prijmeni AS candidate1_surname,
    p.votes1 AS candidate1_votes,
    c2.prijmeni AS candidate2_surname,
    p.votes2 AS candidate2_votes,
    c3.prijmeni AS candidate3_surname,
    p.votes3 AS candidate3_votes,
    c4.prijmeni AS candidate4_surname,
    p.votes4 AS candidate4_votes
FROM
    polls p
        LEFT JOIN candidates c1 ON (p.id_candidate1 = c1.id)
        LEFT JOIN candidates c2 ON (p.id_candidate2 = c2.id)
        LEFT JOIN candidates c3 ON (p.id_candidate3 = c3.id)
        LEFT JOIN candidates c4 ON (p.id_candidate4 = c4.id)
/

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.