Spojení tabulek a transponování tabulky – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Spojení tabulek a transponování tabulky – MySQL – Fórum – Programujte.comSpojení tabulek a transponování tabulky – MySQL – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
eskvélista
~ Anonymní uživatel
4 příspěvky
31. 10. 2015   #1
-
0
-

Ahoj,

po létech jsem nucen si napsat pár SQL dotazů. Celkem v pohodě, díky mnoha příkladům na internetu, ale nemohu hnout s jednou věci. Řeším vytažení dat z eshopu OpenCart a potřebuji si složit data o produktu Běžné spojení tabulek je snadné, ale parametry produktu jsou uloženy v tabulce:

product_id   attribute_id   language_id   text

63                15                2                     Španělsko

63                16                2                     2011

63                17                2                     6ks

...

Pokud tuto tabulku spojím přes product_id s tabulkou popisu produktů:

SELECT * FROM oc_product oc_p, oc_product_attribute oc_a
where oc_p.product_id=oc_a.product_id and oc_a.language_id=2

, vytvoří se mi tolik řádků pro každý produkt, kolik mám parametrů. Lze nějak parametry produktu transponovat, aby výsledná tabulka obsahovala parametry jako sloupce a tedy produkt se všemy entitami a parametry byl jediný řádek?

Předem díky za nakopnutí nebo radu jaký SQL příkaz nastudovat. 

Nahlásit jako SPAM
IP: 109.75.146.–
Reklama
Reklama
Kit+11
Guru
31. 10. 2015   #2
-
0
-

#1 eskvélista
Ano, je to možné: 

SELECT
    misto.product_id,
    misto.text AS mesto,
    lp.text AS rok,
    ks.text AS mnozstvi
FROM tabulka AS misto
    LEFT JOIN tabulka AS lp ON misto.product_id=lp.product_id
    LEFT JOIN tabulka AS ks ON misto.product_id=ks.product_id
WHERE misto.product_id=63
    AND misto.attribute_id=15 AND misto.language_id=2
    AND lp.attribute_id=16 AND lp.language_id=2
    AND ks.attribute_id=17 AND ks.language_id=2

Kdybys uvedl řídicí tabulku, bylo by to o něco jednodušší, bez ní to vypadá trochu hůř.

Složité dotazy jsou daní za to, že si někdo zjednodušil návrh databáze a použil EAV.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
eskvélista
~ Anonymní uživatel
4 příspěvky
31. 10. 2015   #3
-
0
-

Díky, snad to chápu. Jenže já tohle nepotřebuji pro produkt ID=63, ale pro všechny, asi 400 kousků :)

Jinak tabulka produktů, pro jednoduchost, hlavní tabulka je oc_product s product_id a mnoha dalšími sloupci, není to důležité, důležité je, že v této je každý produkt pouze jako jediný řádek.

Nahlásit jako SPAM
IP: 109.75.146.–
eskvélista
~ Anonymní uživatel
4 příspěvky
31. 10. 2015   #4
-
0
-

Díky moc, asi už vím, jak to bylo myšlené. Pro jeden parametr mi to už chodí a asi to bude jen o tom, napsat dostatečný počet řádků pro každý parametr:

SELECT 
    oc_p.product_id,
    oc_p.image,
    rok.text
FROM oc_product oc_p
    LEFT JOIN oc_product_attribute AS rok ON oc_p.product_id=rok.product_id
WHERE
    rok.attribute_id=15 AND rok.language_id=2

Nahlásit jako SPAM
IP: 109.75.146.–
Kit+11
Guru
31. 10. 2015   #5
-
0
-

#3 eskvélista
Důležité jsou alespoň názvy tabulek a názvy potřebných sloupců. Jinak vařím z vody. Tak tedy hlavní tabulka se jmenuje oc_product a tabulka s atributy oc_attribute:

SELECT
    ocp.product_id as id,
    misto.text AS mesto,
    lp.text AS rok,
    ks.text AS mnozstvi
FROM oc_product AS ocp
    LEFT JOIN oc_attribute AS misto ON ocp.product_id=misto.product_id
    LEFT JOIN oc_attribute AS lp ON ocp.product_id=lp.product_id
    LEFT JOIN oc_attribute AS ks ON ocp.product_id=ks.product_id
WHERE misto.attribute_id=15 AND misto.language_id=2
    AND lp.attribute_id=16 AND lp.language_id=2
    AND ks.attribute_id=17 AND ks.language_id=2
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
eskvélista
~ Anonymní uživatel
4 příspěvky
31. 10. 2015   #6
-
0
-

Jo, už jsem to pochopil, přesně takto to teď píšu. Moc díky za nakopnutí!

Nahlásit jako SPAM
IP: 109.75.146.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Spojení tabulek — založil Paja2

Rychlost spojení tabulek — založil BigBear

Spojení dvou tabulek — založil Forest

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý