2016-04-18 13 views
2

Ich habe Haufen Blog Beiträge in meiner Posts Tabelle. Nehmen wir an,schreibe where Klausel Abfrage in MySQL von Komma getrennte IDs

+----+----------------------+-------------------------+ 
| id | title    | categories    | 
+----+----------------------+-------------------------+ 
| 1 | title 1    | 234, 235, 243   | 
| 2 | title 2    | 237      | 
| 2 | title 3    | 234, 243    | 
+----+----------------------+-------------------------+ 

Nun, ich versuche, alle Beiträge zu wählen, wo Kategorien 243. Ich habe bereits versucht, FIND_IN_SET Funktion zu verwenden, die Beiträge auswählen können, wenn id die erste Zahl in Kategorien Feld ist.

Meine aktuelle Abfrage ist wie this- SELECT * FROM posts WHERE FIND_IN_SET(235, Category) <> 0 ORDER BY PostId DESC

Vielen Dank im Voraus.

+0

WHERE FIND_IN_SET (243, Kategorie) sollte funktionieren. – Mihai

+0

Sind Sie sicher, dass Sie den korrekten Spaltennamen eingegeben haben? 'FIND_IN_SET (235, Kategorien)' – poostchi

Antwort

3

Sie sollten wissen, wie schlecht es ist, Kategorien in einer solchen Liste zu speichern. Hier sind einige Gründe:

  • Speichern von Zahlen als Zeichenfolgen ist schlecht.
  • SQL hat relativ schlechte Funktionen zur Zeichenfolgenmanipulation.
  • Die resultierenden Abfragen können keine Indizes verwenden.
  • Fremdschlüsseleinschränkungen können nicht deklariert werden.

Also sollten Sie die Daten reparieren, um eine Junction-Tabelle zu verwenden.

Manchmal sind wir betroffen von schlechten Designentscheidungen anderer Leute.

In diesem Fall würde das Problem die Leerzeichen in der Liste sein. Versuchen Sie folgendes:

WHERE FIND_IN_SET(235, replace(Category, ' ', '') > 0 

Oder alternativ:

WHERE CONCAT(', ', 235, ', ') LIKE CONCAT('%, ', Category, ', %') 

Aber ich möchte Sie ermutigen, Strukturen relationaler Daten korrekt zu verwenden und eine Verknüpfungstabelle zu implementieren.

+0

great.works in Ordnung. :) Ich versuche es, aber du hast eine Antwort vor mir gegeben und besser als meine. – RJParikh

+0

tolle Lösung. bin dankbar. –