sql >> Database teknologi >  >> RDS >> Mysql

Hvordan implementerer man filtersystem i SQL?

entity-attribute-value model, som du foreslår, kunne passe ind i dette scenarie.

Med hensyn til filtreringsforespørgslen skal du forstå, at med EAV-modellen vil du ofre masser af forespørgselskraft, så dette kan blive ret vanskeligt. Men denne ene måde at løse dit problem på:

SELECT stuff.id FROM stuff JOIN (SELECT COUNT(*) matcher FROM tabel WHERE (`nøgle` =X1 OG `værdi` =V1) ELLER (`nøgle` =X2 OG `værdi` =V2) GROUP BY id ) sub_t ON (sub_t.matches =2 OG sub_t.id =stuff.id) GROUP BY stuff.id; 

En uelegant egenskab ved denne tilgang er, at du skal angive antallet af attribut/værdi-par, som du forventer at matche i sub_t.matches =2 . Hvis vi havde tre betingelser, ville vi have været nødt til at angive sub_t.matches =3 , og så videre.

Lad os bygge en testcase:

CREATE TABLE stuff (`id` varchar(20), `key` varchar(20), `value` varchar(20));INSERT INTO stuff VALUES ('æble', 'farve', 'rød' ');INSERT INTO stuff VALUES ('mango', 'farve', 'gul');INSERT INTO stuff VALUES ('banan', 'farve', 'gul');INSERT INTO stuff VALUES ('æble', 'smag' ', 'sød'); INDSÆT I ting-VÆRDIER ('mango', 'smag', 'sød'); INDSÆT I ting-VÆRDIER ('banan', 'smag', 'bitter-sød'); INDSÆT I ting-VÆRDIER ( 'æble', 'oprindelse', 'US');INSERT INTO stuff VALUES ('mango', 'origin', 'MEXICO');INSERT INTO stuff VALUES ('banan', 'origin', 'US'); 

Forespørgsel:

SELECT stuff.id FROM stuff JOIN (SELECT COUNT(*) matcher, id FROM stuff WHERE (`key` ='color' OG `value` ='gul') ELLER (`key` ='smag ' OG `value` ='sød') GRUPPER EFTER id ) sub_t ON (sub_t.matches =2 OG sub_t.id =stuff.id) GRUPPER EFTER stuff.id; 

Resultat:

+-------+| id |+-------+| mango |+-------+1 række i sæt (0,02 sek.)

Lad os nu indsætte en anden frugt med color=yellow og smag=sød :

INSERT INTO stuff VALUES ('pære', 'farve', 'gul');INSERT INTO stuff VALUES ('pære', 'smag', 'sød');INSERT INTO stuff VALUES ('pære' , 'oprindelse', 'et sted'); 

Den samme forespørgsel ville returnere:

+-------+| id |+-------+| mango || pære |+-------+2 rækker i sæt (0,00 sek.)

Hvis vi ønsker at begrænse dette resultat til enheder med origin=MEXICO , bliver vi nødt til at tilføje en anden ELLER betingelse og kontroller for sub_t.matches =3 i stedet for 2 .

SELECT stuff.id FROM stuff JOIN (SELECT COUNT(*) matcher, id FROM stuff WHERE (`key` ='color' OG `value` ='gul') ELLER (`key` ='smag ' OG `value` ='sweet') ELLER (`key` ='origin' OG `value` ='MEXICO') GRUPPER EFTER id ) sub_t ON (sub_t.matches =3 OG sub_t.id =stuff.id)GROUP AF stuff.id; 

Resultat:

+-------+| id |+-------+| mango |+-------+1 række i sæt (0,00 sek.)

Som i enhver tilgang er der visse fordele og ulemper ved brug af EAV-modellen. Sørg for at undersøge emnet grundigt i forbindelse med din ansøgning. Du vil måske endda overveje en alternativ relationsdatabase, såsom Cassandra , CouchDB , MongoDB , Voldemort , HBase , SimpleDB eller andre nøgleværdibutikker.



  1. Tilslutning af RazorSQL til Salesforce.com

  2. Postgres - Konverter tilgrænsende liste til indlejret JSON-objekt

  3. Sådan får du en liste over primær nøglebegrænsning fra alle databaser på SQL Server Instance - SQL Server / TSQL Tutorial Del 60

  4. mysql ordre efter rand() ydeevne problem og løsning