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:
  1. SELECT page  
  2. FROM table   
  3. WHERE label LIKE '%kék%' OR label LIKE '%zöld%' OR label LIKE '%piros%'  
  4. 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.
  1. SELECT * FROM tabla   
  2. WHERE label   
  3.   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:
  1. SELECT * FROM tabla   
  2. GROUP BY page  
  3.   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:
  1. SELECT page  
  2. FROM table  
  3. WHERE page IN (SELECT page FROM table WHERE label = 'kék'AND  
  4.       page IN (SELECT page FROM table WHERE label = 'zöld'AND  
  5.       page IN (SELECT page FROM table WHERE label = 'piros')  
Borzasztó, de a feladatot megoldja. ;)