Sziasztok!
Van egy cikkek táblám, a cikkeknek pedig vannak szerzőik. Egy cikknek több szerzője is lehet, tehát ez egy a többhöz kapcsolat, ezért van egy szerzők táblám, a kettő között pedig egy relációs tábla. Lásd mintaadat:
http://hup.pastebin.com/p3nErbr6
Szeretném a "Masodik Szerzo"-höz tartozó cikkeket kilistázni a szerzők neveivel. Ha a következőt teszem, akkor valóban csak a szerző által írt cikkek jelennek meg, de a cikk két szerzője közül csak az jelenik meg, akire a keresés irányult:
SELECT cikkek.*, GROUP_CONCAT(DISTINCT szerzok.nev SEPARATOR ", ") AS 'szerzok' FROM cikkek LEFT JOIN relacio USING (cikk_id) LEFT JOIN szerzok USING (szerzo_id) WHERE szerzok.nev = 'Masodik Szerzo' GROUP BY cikkek.cikk_id;
Hogyan tudnám megoldani, hogy a cikk összes szerzője megjelenjen?
Két megjegyzés:
- A lekérdezés fő táblájának a 'cikkek'-nek kell lennie.
- Szerzőt id és név alapján is lehet szűrni az alkalmazásban.
Előre is köszönöm a segítséget!
- 1451 megtekintés
Hozzászólások
UP
- A hozzászóláshoz be kell jelentkezni
Jobb ötlet híján subquery lett belőle, így működik:
SELECT cikkek.*, GROUP_CONCAT(DISTINCT szerzok.nev SEPARATOR ", ") AS 'szerzok' FROM cikkek LEFT JOIN relacio USING (cikk_id) LEFT JOIN szerzok USING (szerzo_id) WHERE cikkek.cikk_id IN (SELECT cikkek.cikk_id FROM cikkek LEFT JOIN relacio USING (cikk_id) LEFT JOIN szerzok USING (szerzo_id) WHERE szerzok.nev = 'Masodik Szerzo') GROUP BY cikkek.cikk_id
- A hozzászóláshoz be kell jelentkezni
Én két részre bontanám a feladatot:
(1) A megadott szerző által írt cikkek
(2) Cikkek és hozzátartozó szerzők listázása cikk_id alapján
(1)
SELECT relacio.cikk_id
FROM szerzok, relacio
WHERE szerzok.szerzo_id = relacio.szerzo_id AND relacio.szerzo_id = 2;
(2)
SELECT cikkek.title, szerzok.nev
FROM cikkek, relacio, szerzok
WHERE cikkek.cikk_id = relacio.cikk_id AND szerzok.szerzo_id = relacio.szerzo_id
AND relacio.cikk_id in (1,2);
Az (1,2) helyébe behelyettesíthető az első lekérdezés
A GROUP_CONCAT csak 1024 bájtig ír ki!!!
- A hozzászóláshoz be kell jelentkezni
"A GROUP_CONCAT csak 1024 bájtig ír ki!!!":
De ezen lehet változtatni egyszerűen.
- A hozzászóláshoz be kell jelentkezni
Ez tulajdonképpen ugyanaz, mint a subquerys megoldás, azzal a különbséggel hogy a subquery itt külön lekérdezés. Azért majd tesztelni fogom hogy melyik gyorsabb, subquery, vagy két külön query. A GROUP_CONCAT maximális mérete valóban könnyen állítható, de nem hiszem hogy szükség lesz rá. 1024 karakter az durván minimum 10 szerző, a cikkek többségének pedig kevesebb mint 5 szerzője van.
- A hozzászóláshoz be kell jelentkezni
Tipp: karakter != byte. De ettol meg igazad van, 51 karakter (ennyi a min. UTF-8 -at feltetelezve) bosegesen eleg kell legyen egy nevhez).
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.
- A hozzászóláshoz be kell jelentkezni