CJ největší affiliate síť v ČR, 40+ inzerentů CPC,CPL,CPO model. Začni vydělávat teď
Zobrazují se odpovědi 1 až 7 z 7

Vyber dat pres spojovaci tabulku

  1. Ahoj,

    Používám databázi Mysql, mám v ní tabulky Clanek, Kategorie, Clanek_Kategorie (spojovací). Každej článek může mít několik kategorií.

    Snažím se to zapsat nějakým způsobem zapsat do jednoho dotazu místo abych dělal psí kusy v PHP.

    Ale nějak tomu nemůžu přijít na kloub.

    Spojovací tabulka vypadá asi tak:

    clanek_id | kategorie_id
    1 | 2
    1 | 3
    1 | 5
    2 | 2
    3 | 5
    3 | 2

    pokud napisu tento dotaz:

    Kód:
    SELECT clanek.id, clanek.nazev, kategorie.nazev
    FROM clanek_kategorie
    LEFT JOIN kategorie ON clanek_kategorie.kategorie_id = kategorie.id
    LEFT JOIN clanek ON clanek_kategorie.clanek_id = clanek.id
    WHERE clanek.status = "1"
    ORDER BY clanek.datum DESC
    Výpis vypadá asi nějak tak:

    1 | Ahoj svete | Životní styl
    1 | Ahoj svete | Osobní
    1 | Ahoj svete | Komedie

    Ale potřebuju dosáhnout toho, aby výsledek vypadal takto:

    1 | Ahoj svete | Životní styl, osobní, komedie

    Zároveň ale potřebuji abz se zobrazily i články, které nejsou ve spojovací tabulce... zkrátka všechny.

    Možná je to komplikované řešení, jsem tak trochu nahranej. Jde jen o přiřazování kategorií k článku.

    Ale řešení, že bych u každého článku měl sloupec "kategorie_id" a bylo to tam zapsané asi tak "2,3,5" je asi ještě horší než spojovací tabulkou.


    Je to možné udělat přímo v jednom mysql dotazu?

    Příjmu i jiné řešení.

    Díky
    Naposledy upravil since : 15.07.2011 v 17:06

  2. Mam pocit ze relacni algebra Ti takovou operaci neumoznuje. Pro tyto pripady je obecne k dispozici mechanismus Stored Procedure; nespecifikujes ale kterou DB pouzivas tudiz Ti k tomu nic blizsiho nemuzu rict.

  3. Citace Původně odeslal lidoop Zobrazit příspěvek
    Mam pocit ze relacni algebra Ti takovou operaci neumoznuje. Pro tyto pripady je obecne k dispozici mechanismus Stored Procedure; nespecifikujes ale kterou DB pouzivas tudiz Ti k tomu nic blizsiho nemuzu rict.
    Zapoměl jsem, opraveno.

    Používám MYSQL.

    Pokud takovou operaci neumožňuje, tak jak to udělat lépe? například vybrat 3 tabulky a pak je spojit až v PHP ve výpisu? Nebo raději u každého článku mít sloupec "kategorie_id" a mít tam několik ID kategorií a bez spojovací tabulky? TTo řešení je jednoduší ale asi je to prasečina.

  4. toto by mohlo fungovat:

    Kód:
    SELECT c.id, c.nazev, GROUP_CONCAT( k.nazev )
    FROM clanek AS c
    LEFT JOIN clanek_kategorie AS ck ON ck.clanek_id = c.id
    LEFT JOIN kategorie AS k ON ck.kategorie_id = k.id
    WHERE c.status = "1"
    GROUP BY c.id

  5. jina varianta :)

    SELECT clanek.id, clanek.nazev,
    (SELECT GROUP_CONCAT(nazev) FROM kategorie AS k JOIN clanek_kategorie AS ck ON k.id=ck.kategorie_id WHERE ck.clanek_id=clanek.id ) AS kategorie_nazev
    FROM `clanek` WHERE clanek.status = "1"
    ORDER BY clanek.datum DESC

  6. Díky oboum. Teď která varianta je rychlejší na vykonání? :) Verzi od txr jsem odzkoušel a funguje...

  7. Citace Původně odeslal since Zobrazit příspěvek
    Díky oboum. Teď která varianta je rychlejší na vykonání? :) Verzi od txr jsem odzkoušel a funguje...
    Na to se jednoznacne neda odpovedet, zalezi to na mnoha faktorech. Obecne se da rict, ze to vyjde relativne dost na stejno.
    Jedinej rozdil je v tom, ze moje reseni je asi o neco jednodussi pro tento konkretni priklad. Kolegovo reseni, je lepe navrzene z obecneho hlediska a budouci pripadne rozsiritelnosti ci upravy.

Podobná témata

  1. Ikona pro tabulku
    By winexec in forum Chyby
    Odpovědí: 1
    Poslední příspěvek: 26.11.2010, 15:44
  2. vytvaret tabulku nebo sloupec?
    By Tom Novy in forum PHP
    Odpovědí: 22
    Poslední příspěvek: 23.11.2010, 00:56
  3. Odeslani pres PHP
    By inject in forum PHP
    Odpovědí: 9
    Poslední příspěvek: 24.08.2010, 14:41
  4. Jak ve WP vložit do článku tabulku?
    By francomorte in forum Wordpress
    Odpovědí: 6
    Poslední příspěvek: 21.10.2009, 21:48
Hostujeme u Server powered by TELE3