ugrás a tartalomhoz

Többszörös keresés egyszerűen MySQL-ben

Attus · 2009. Aug. 25. (K), 12.53
Kaptam nemrég egy feladatot, és nem tudtam rá a megoldást. Hátha itt valaki tudja.

Adott egy tábla, két mezője van:
page varchar
label varchar
Egy oldalhoz több címke is tartozhat.

A feladat: azokat az elemeket kell vizsgálni, amiknek van a címkéi közt "kék", "zöld" és "piros" is.
Egyszeres lekérdezés kell, az nem megoldás, hogy legyűjtöm külön-külön, majd veszem a keresztmetszetet.

Már nincs tétje, mert buktam a tesztet, de szeretném legalább utólag megtudni, és nem találtam meg a megoldást.
 
1

Valahogy így

tisch.david · 2009. Aug. 25. (K), 14.02
Szia!

A lekérdezés kinézhetne valahogy így:
SELECT page
FROM table 
WHERE label LIKE '%kék%' OR label LIKE '%zöld%' OR label LIKE '%piros%'
GROUP BY page
Üdv:
Dávid
2

Struktúra?

Poetro · 2009. Aug. 25. (K), 14.03
Mivel nem írtad, hogy mit takar egy elem, mit jelent a page és mit jelent a lével, és mik az elemek első körben feltételezzük, hogy a label tartalmazza vesszővel elválasztva a címkéket, minden címkét legfejlebb egyszer tartalmazhat.
SELECT * FROM tabla 
WHERE label 
  REGEXP '(^|,)(kek|zold|piros),(.+,)?(kék|zöld|piros),(.+,)?(kek|zold|piros)(,|$)';
Ha a page az azonosító, és egy label egy címkét tartalmaz, akkor lehet SUM-mal jatszani:
SELECT * FROM tabla 
GROUP BY page
  HAVING SUM(IF(label IN ('kék', 'zöld', 'piros'), 1, 0)) = 3
vagy valami ilyesmi, nem próbáltam ki.
3

Jogos az észrevétel, szóval

Attus · 2009. Aug. 25. (K), 16.06
Jogos az észrevétel, szóval egy rekordban egy page azonosító, és egy label van. Tehát egy page szerepelhet többször, mégpedig annyiszor, ahány label tartozik hozzá.
És csak azokat kell kigyűjteni, amihez mindhárom label meg van adva.

Szóval a második megoldásod tűnik jónak. Bevallom, ezt a függvényt nem ismertem.
4

Subselect

tisch.david · 2009. Aug. 26. (Sze), 09.44
Nem akarlak frusztrálni, de - jóval kevésbé hatékonyan - egyszerű subselect-tel is megoldhattad volna:
SELECT page
FROM table
WHERE page IN (SELECT page FROM table WHERE label = 'kék') AND
      page IN (SELECT page FROM table WHERE label = 'zöld') AND
      page IN (SELECT page FROM table WHERE label = 'piros')
Borzasztó, de a feladatot megoldja. ;)