SQL atranka pagal kelis kriterijus

Rugsėjis21

Žymės: sql

Pasidalink

Rašinio pavadinimas gal ir neaiškus, tačiau situacija paprasta: turime straipsnių ir straipsnių žymių (tags) lenteles, sujungtas ryšiu „1..n“. Reikia atlikti paiešką (atrinkti straipsnius) pagal kelias žymes (kai visos nurodytos žymės priklauso straipsniui). Sprendimas žemiau.

Lentelių struktūra

+-------------+   +-------------+
| articles    |   | tags        |
+-------------+   +-------------+
| id          |   | id          |
|(kiti laukai)|   | articleId   |
+-------------+   | tag         |
                  +-------------+

 SQL užklausa:

SELECT a.* FROM articles AS a
INNER JOIN tags AS t ON a.id=t.articleId
WHERE t.tag='Žymė 1' OR t.tag='Žymė 2'
GROUP BY a.id
HAVING COUNT(*)=2

Dinamiškai formuojant tokią užklausą HAVING dalyje reikia naudoti tokį skaičių, kiek žymių dalyvauja užklausoje.

Komentarai

ichmbch (2010-09-21 23:50:33)
Aš manau, kad čia galimų sprendimų yra labai daug :)
Galima tiesiog prijungti tags lentelę kelis kartus arba galima nieko nejungti, o tiesiog tikrinti ar konkretūs id yra tarp tags lentelės articleId.
OpenID Paulius (2010-10-03 22:33:07)
MongoDB tokia užklausa atrodytų dar paprasčiau:
db.kolekcija.find({tag: {$all: ['Žymė 1', 'Žymė 2']}})

Plačiau apie MongoDB, jos panaudojimo atvejus ir galimybes, parašysiu kiek vėliau.



(Tinklalapis arba OpenID)