Autor Zpráva
smiesek
Profil
Můžete mě prosím navést, nedaří se mi přijít na základní JOIN pro výpis dat z tabulky, kdy se snažím o výpis souvisejících produktů:
mám tabulku se sloupci: id | hlavni_id | souvisejici_id

hlavní a související produkty k sobě přiřazuju pomocí formuláře option.

Mám problém nyní vypsat kompletní informace, které se vztahují k hlavnímu a souvisejícímu produktu, kdy jsem se dostala do následující podoby, která mi však výpis končí chybou:
SELECT so.id, so.hlavni_id, so.souvisejici_id
            FROM souvisejici AS so
            LEFT JOIN kosik AS ko
            ON so.hlavni_id=ko.id
            LEFT JOIN kosik AS ko
            ON so.souvisejici_id=ko.id

Pokud vynechám
LEFT JOIN kosik AS ko
            ON so.souvisejici_id=ko.id
vypíše se mi do tabulky zcela totožné info jak pro hlavní tak související, v tomto případě to bude mít všechno info z hlavního produktu, pokud vynechám zase místo souvisejícího hlavní, tak data budou se vypisovat ze souvisejícího.

Ten option formuláře tahám vlastně z jedné tabulky kosik, samozřejmě mám podmínku, aby se nepřiřadil jak hlavní tak související jedno a totéž produkt.

Nevím jak to vhodně pojmenovat, ani popsat, ale budu doufat, že je alespoň trochu srozumitelné, oč mi jde a v čem mám problém.
nightfish
Profil
Nemůžeš použít dvakrát ten stejný alias, když připojuješ stejnou tabulku vícekrát. Takže řešení:
SELECT so.id, so.hlavni_id, so.souvisejici_id
            FROM souvisejici AS so
            LEFT JOIN kosik AS ko_hlavni
            ON so.hlavni_id=ko_hlavni.id
            LEFT JOIN kosik AS ko_souvisejici
            ON so.souvisejici_id=ko_souvisejici.id

(Mimochodem takto ten dotaz nedává moc smysl, protože za SELECTem máš uvedené sloupce pouze z tabulky souvisejici a ne z těch připojených tabulek...)
smiesek
Profil
nightfish:
děkuju prostuduju, jinak mi šlo právě o ten alias, to ostatní mi funguje, proto jsem dala jen tu část, kde jsem si myslela, že dělám chybu
smiesek
Profil
tak ještě mi to stále vypisuje chybu, protože nyní nevím, jak použít tu připojenou tabulku:
LEFT JOIN produkt AS pr
            ON pr.hlavni_id=pr.id

v tabulce:
produkt

jsou všechny informace o produktu, odkama je vkládám do tabulky:
kosik

a z košíku to jde do tabulky:
souvisejici

takže zase budu muset pro produkt definovat 2x alias?

LEFT JOIN produkt AS pr
            ON pr.hlavni_id=pr.id
LEFT JOIN produkt AS pr
            ON pr.vedlejsi_id=pr.id
Casero
Profil
smiesek:
takže zase budu muset pro produkt definovat 2x alias?

Ano. Je potřeba tabulky odlišit, i když se jedná o stejnou tabulky -> nebo spíše u nich alias musí být, aby je šlo odlišit.
smiesek
Profil
jak mám prosím definovat tu připojenou tabulku? :(
LEFT JOIN produkt AS pr
            ON pr.hlavni_id=pr.id
LEFT JOIN produkt AS pr
            ON pr.vedlejsi_id=pr.id

nebo

LEFT JOIN produkt AS pr_h
            ON pr.hlavni_id=pr.id
LEFT JOIN produkt AS pr_v
            ON pr.vedlejsi_id=pr.id

vůbec nevím co s tím nic to nevypisuje
nightfish
Profil
smiesek:
vůbec nevím co s tím nic to nevypisuje
Dobrým začátkem by bylo poslat celý dotaz, protože nikdo z nás nedisponuje věšteckou koulí.

Nicméně pokud je v dotazu nějaká tabulka s aliasem pr, která má sloupce hlavni_id a vedlejsi_id, tak by mohlo pomoct:
LEFT JOIN produkt AS pr_h
            ON pr.hlavni_id=pr_h.id
LEFT JOIN produkt AS pr_v
            ON pr.vedlejsi_id=pr_v.id
smiesek
Profil
SELECT so.id, so.hlavni_id, so.souvisejici_id,
                vy.nazev AS vyrobce,
                pr.oznaceni AS produkt, pr.rok AS rok,
                ko.url AS url,
                na1.popis, na1.nazev,
                na2.nazev AS naz2,
                na3.nazev AS naz3,
                na4.nazev AS naz4
            FROM souvisejici AS so
            LEFT JOIN kosik AS ko_hlavni
            ON so.hlavni_id=ko_hlavni.id
            LEFT JOIN kosik AS ko_souvisejici
            ON so.souvisejici_id=ko_souvisejici.id
            LEFT JOIN produkt AS pr
            ON ko.produkt_id=pr.id
            LEFT JOIN vyrobce AS vy
            ON pr.vyrobce_id=vy.id 
            LEFT JOIN nazev AS na1
            ON pr.nazev1_id=na1.id
            LEFT JOIN nazev AS na2
            ON pr.nazev2_id=na2.id
            LEFT JOIN nazev AS na3
            ON pr.nazev3_id=na3.id
            LEFT JOIN nazev AS na4
            ON pr.nazev4_id=na4.id

Pracuju s tabulka:
1) vyrobce, kterého následně využiju pro přiřazení do tabulky produkt
2) produkt, do které vkládám data o produktu jako je výrobce, rok, název apod.
3) kosik, do kterého vkládám již vytvořený řádek produkt, kde přiřazuju obrázek, cenu apod.
4) souvisejici, kde vkládám 2 produkty, které vybírám z tabulky košík a tu mám problém s výše uvedeným dotazem, aby se mi vypsal záznam:
hlavni | souvisejici
Casero
Profil
smiesek:
Podle toho dotazu to bohužel vypadá na velmi špatný návrh databáze. Pokud je projekt v rané fázi, tak by stálo za zvážení upravit.

Nicméně, co se týče čistě dotazu (krom zatajeneho vyznamu tabulky nazev je tam spousta chyb):

SELECT so.id, so.hlavni_id, so.souvisejici_id,
                vy_h.nazev AS vyrobce_hlavni,
                pr_v.oznaceni AS produkt, pr_v.rok AS rok,
                ko_hlavni.url AS url
            FROM souvisejici AS so
            LEFT JOIN kosik AS ko_hlavni
            ON so.hlavni_id=ko_hlavni.id
            LEFT JOIN kosik AS ko_souvisejici
            ON so.souvisejici_id=ko_souvisejici.id
            LEFT JOIN produkt AS pr_h
            ON ko_hlavni.produkt_id=pr_h.id
            LEFT JOIN produkt AS pr_v
            ON ko_souvisejici.produkt_id=pr_v.id
            LEFT JOIN vyrobce AS vy_h
            ON pr_h.vyrobce_id=vy_h.id 
             LEFT JOIN vyrobce AS vy_v
            ON pr_v.vyrobce_id=vy_v.id 
          
smiesek
Profil
Casero:
vy_h.nazev AS vyrobce_hlavni, pr_v.oznaceni AS produkt, pr_v.rok AS rok, ko_hlavni.url AS url
nechápu prosím tuto část, chvilku jako hlavní, pak zase vedlejší...

nazev není utajená, viz.
2) produkt, do které vkládám data o produktu jako je výrobce, rok, název apod.
Casero
Profil
smiesek:
nechápu prosím tuto část, chvilku jako hlavní, pak zase vedlejší...
Pouze ukázka. Je na tobě, jaké sloupce budeš potřebovat. Na začátek si tam můžeš dát znak * a zobrazit všechny sloupce, co dostaneš.

2) produkt, do které vkládám data o produktu jako je výrobce, rok, název apod.
Tak trošku se ti tam pletou atributy a tabulky. :)
smiesek
Profil
Casero:
tak už mi je to srozumitelné a už mi to funguje :-) Je to triviální a já jsem za tím hledala složitosti.

Chyba byla hned jako první ta, že jsem jak pro hlavni tak vedlejsi produkt používala stejné proměnné, a to i v případě, že jsem dle doporučení odlišila aliasy, ale s těmi jsem dále nepracovala pro výpis záznamů do stránky
echo $vyrobce_hlavni, $vyrobce_vedlejsi;

Takže nakopnutí, že každá proměnná musí jedinečná, pomohlo :-)

smiesek:
vy_h.nazev AS vyrobce_hlavni, pr_v.oznaceni AS produkt, pr_v.rok AS rok, ko_hlavni.url AS url
vy_h.nazev AS vyrobce_hlavni, pr_h.oznaceni AS produkt_hlavni, pr_h.rok AS rok_hlavni, url_h.url AS url_hlavni,
vy_v.nazev AS vyrobce_vedlejsi, pr_v.oznaceni AS produkt_vedlejsi, pr_v.rok AS rok_vedlejsi, url_v.url AS url_vedlejsi

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0