Értékek egy csoportját tartalmazó sorok lekérése
Környezet: MySQL 4.1, Apache 2.0.2 (Ubuntu 7.10)
Adatbázis-háttér:Cél: Keresem azon gyümölcsök neveit, amelyekben mondjuk az 1-es és 3-as kukac is megtalálható (alma, korte, cseresznye).
Kukacfajtából lehet sok-sok (akár több tucat is), vagyis a többszörös JOIN, UNION szerintem nem megoldás.
Ameddig jutottam:Ez nyilvánvalóan rossz, mivel nem a kukac_id-k metszetét, hanem únióját adja (a 'WHERE kukac_id IN(1, 3) GROUP BY gyumolcs_id' feltétel rossz).
Amit próbáltam: Google, Weblabor, MySQL manual, sok-sok próba GROUP BY-jal és testvéreivel. :)
Végeredményben azzal már boldog lennék, ha tudnám, hogyan lehet lekérni azon sorokat, melyek összességében tartalmazzák egy érték-csoport értékeit (esetünkben azon sorokat, melyek pl. az 1-es és 3-as kukac_id-ket).
Elnézést kérek, ha láma dolgot kérdezek, az esetleges segítséget pedig előre is köszönöm!
■ Adatbázis-háttér:
CREATE TABLE gyumolcsok (
gyumolcs_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
gyumolcs_nev VARCHAR(10) NOT NULL);
CREATE TABLE kukacok_gyumolcsokben (
gyumolcs_id TINYINT UNSIGNED NOT NULL,
kukac_id TINYINT UNSIGNED NOT NULL);
INSERT INTO gyumolcsok (gyumolcs_id, gyumolcs_nev) VALUES
(1, 'alma'),
(2, 'korte'),
(3, 'barack'),
(4, 'cseresznye');
INSERT INTO kukacok_gyumolcsokben (gyumolcs_id, kukac_id) VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(1, 5),
(2, 1),
(2, 3),
(2, 4),
(2, 6),
(3, 1),
(3, 2),
(3, 5),
(4, 1),
(4, 2),
(4, 3);
Kukacfajtából lehet sok-sok (akár több tucat is), vagyis a többszörös JOIN, UNION szerintem nem megoldás.
Ameddig jutottam:
SELECT gyumolcs_nev FROM gyumolcsok WHERE gyumolcs_id IN (SELECT gyumolcs_id FROM kukacok_gyumolcsokben WHERE kukac_id IN(1, 3) GROUP BY gyumolcs_id)
Amit próbáltam: Google, Weblabor, MySQL manual, sok-sok próba GROUP BY-jal és testvéreivel. :)
Végeredményben azzal már boldog lennék, ha tudnám, hogyan lehet lekérni azon sorokat, melyek összességében tartalmazzák egy érték-csoport értékeit (esetünkben azon sorokat, melyek pl. az 1-es és 3-as kukac_id-ket).
Elnézést kérek, ha láma dolgot kérdezek, az esetleges segítséget pedig előre is köszönöm!
nem probaltam ki
Ez sajnos szintén únió
Mindenesetre köszönöm, hogy foglalkoztál vele! Ha esetleg van még ötlet, örömmel fogadnám.
subquery jó
Ez is únió
Másrészt a több OR az eredmény szempontjából megfelel az IN-nek (noha sokkal hosszabb és szvsz kevésbé elegáns query-t eredményez), vagyis ekkor továbbra is azon gyümölcsöket fogja megtalálni, amelyekben 1-es VAGY 3-as kukac van, nem pedig azokat, melyekben 1-es ÉS 3-as kukac is.
Az AND értelemszerűen nem használható, mert nincs olyan sor a kukacok_gyumolcsokben táblában, melyre igaz lehetne a kukac_id=1 AND kukac_id=3 feltétel (egy sor csak egyféle kukac_id-t tartalmazhat).
A subquery-vel tehát azon gyumolcs_id-ket szeretném megkapni, melyeknek megfelelő sorok teljes halmazában van 1-es és 3-as kukac_id egyaránt.
Mindenesetre köszönöm neked is a fáradozást!
bocsi :)
Most is tanultam vmit :)
Minden kukac 1 join
Több tucat join szerintem nem hatékony
A fentiek miatt vetettem el ezt az utat.
Persze meggyőzhető vagyok, hogy hatékonyabb, mint két lekérés eredményeit összefésülni. :)
Köszönöm a választ!
No problem
Többszörös JOIN
Többszörös join elvetése - l. fentebb
Fentebb írtam, hogy akár több tucat kukac is kellhet egy gyümölcsnél, emiatt a többszörös join szerintem nem szerencsés.
Mindenesetre köszönöm neked is a választ!
Ha pedig valakinek van jobb ötlete, azt örömmel fogadnám.
Két lekérés?
A JOIN nem hiszem, hogy probléma lenne, persze egy jó helyre rakott index használatával együtt.
Többszörös JOIN nélkül
aggregátor függvény
(postgresben így: http://www.postgresql.org/docs/8.1/interactive/xaggr.html)
szerk.: rákerestem Google-ben, lehet MySQL alatt is aggregátor függvényt csinálni, viszont úgy tűnik, nem tud visszatérési értéknek tömböt: http://dev.mysql.com/doc/refman/5.0/en/create-function.html