sql >> Database >  >> RDS >> Mysql

Door komma's gescheiden waarden in de MySQL IN-clausule

Voortbouwend op het FIND_IN_SET() voorbeeld van @Jeremy Smith, kunt u dit doen met een join, zodat u geen subquery hoeft uit te voeren.

SELECT * FROM table t
JOIN locations l ON FIND_IN_SET(t.e_ID, l.city) > 0
WHERE l.e_ID = ?

Het is bekend dat dit zeer slecht presteert, omdat het tabelscans moet uitvoeren, waarbij de functie FIND_IN_SET() voor elke wordt geëvalueerd. combinatie van rijen in table en locations . Het kan geen gebruik maken van een index en er is geen manier om het te verbeteren.

Ik weet dat je zei dat je het beste probeert te maken van een slecht databaseontwerp, maar je moet begrijpen hoe erg slecht dit is.

Uitleg:Stel dat ik u zou vragen om iedereen op te zoeken in een telefoonboek waarvan de eerste, middelste of laatste initiaal "J" is. De gesorteerde volgorde van het boek helpt in dit geval niet, aangezien je toch elke pagina moet scannen.

De LIKE oplossing gegeven door @fthiella heeft een soortgelijk probleem met betrekking tot prestaties. Het kan niet worden geïndexeerd.

Zie ook mijn antwoord op Is het echt zo erg om een ​​gescheiden lijst in een databasekolom op te slaan? voor andere valkuilen van deze manier van opslaan van gedenormaliseerde gegevens.

Als u een aanvullende tabel kunt maken om een ​​index op te slaan, kunt u de locaties toewijzen aan elk item in de stedenlijst:

CREATE TABLE location2city (
 location INT,
 city INT,
 PRIMARY KEY (location, city)
); 

Ervan uitgaande dat je een opzoektabel hebt voor alle mogelijke steden (niet alleen die genoemd in de table ) u kunt de inefficiëntie één keer verdragen om de afbeelding te maken:

INSERT INTO location2city (location, city)
  SELECT l.e_ID, c.e_ID FROM cities c JOIN locations l
  ON FIND_IN_SET(c.e_ID, l.city) > 0;

Nu kunt u een veel efficiëntere zoekopdracht uitvoeren om items in uw table te vinden :

SELECT * FROM location2city l
JOIN table t ON t.e_ID = l.city
WHERE l.e_ID = ?;

Hierbij kan gebruik worden gemaakt van een index. Nu moet je er alleen voor zorgen dat elke INSERT/UPDATE/DELETE van rijen in locations voegt ook de corresponderende toewijzingsrijen in location2city in .



  1. Zoek n dichtstbijzijnde buren voor een bepaald punt met behulp van PostGIS?

  2. MySQL haalt variabele op uit opgeslagen procedure in PHP PDO

  3. Postgres-dump van alleen delen van tabellen voor een dev-snapshot

  4. YEARWEEK() Voorbeelden – MySQL