2016-03-23 7 views
-1

Wenn ich alle recipeid s auswählen möchten, dass man tagsid, zum Beispiel umfassen:SQL wählen aus mehreren tagsid in derselben Zeile

tagsid = 1 
recipeid = 2|12|1|8 

Wenn ich diesen Code verwenden:

$query = "SELECT * FROM recipe where tagsid like '%".$tag_id."%'"; 

es zeigen recipeid1 in tagsid12, 1, aber es sollte nur in tagsid 1 sein. Warum ist das falsch?

+2

Ihre Datenbank muss normalisiert werden, um diesen Fall problemlos bewältigen zu können. Der Grund, warum Sie ein Problem haben, ist, dass '1' in der Zahl' 12' steht und Sie 'LIKE' verwenden, das nur nach einem Teilstring sucht. Sie könnten versuchen, wie '% | ". $ Tag_id." |%' "', Aber das hat andere Probleme. –

+1

Tun Sie sich einen Gefallen, und normalisieren Sie Ihr Datenschema ^^ – moonwave99

+0

Ich denke, Sie Frage wurde nach der Bearbeitung unklar kann man verstehen, was "rezeptid" ist, während Sie "tagsid" in Ihrer Abfrage haben? –

Antwort

0

mit Trennzeichen, mit Begrenzer nach, aber nichts vor, oder mit Trennzeichen vor, aber nichts nach

$query = "SELECT * FROM recipe WHERE tagsid LIKE '%|".$tag_id."|%' OR tagsid LIKE '".$tag_id."|%' OR tagsid LIKE '%|".$tag_id."'"; 
+0

Vielen Dank für Ihre Hilfe ...^_^ – OsamahM

+0

kein Problem - Gad es half –

0

Sie sollten für ein Auftreten des von diesen tag_idtag_id entweder zwischen | oder wenn der Wert beginnt finden mit einem | nach. Ich denke du hast immer | nach tag_id.

$query = 
    "SELECT * 
    FROM recipe 
    where tagsid like '%|".$tag_id."|%'" or 
      tagsid like '".$tag_id."|%'"; 

Zwei Fälle sollten in Betracht gezogen werden:

%|<tag_id>|% - nicht auf dem ersten Platz

<tag_id>|% - auf dem ersten Platz

es recipeid 1 in tagsid 12 zeigen, 1 , aber es sollte nur in Tagsid 1 sein. Warum ist das falsch?

Da % Symbol funktioniert als Platzhalter eine beliebige Anzahl von jede Suche symbols.You Bedeutung für %1% Muster. Alle Zeichenfolgen mit mindestens einer 1 Teilzeichenfolge stimmen mit dem Muster überein. 12| als auch.

0

Verwenden FIND_IN_SET() auf die tagsid Spalte nach den Rohren durch Kommas zu ersetzen.

$query = "SELECT * 
      FROM recipe 
      WHERE COALESCE(FIND_IN_SET($tag_id, REPLACE(tagsid, '|', ',')), 0) > 0" 

Übrigens sollten Sie vermeiden, CSV in einer Spalte zu speichern, weil es schwierig ist, mit zu arbeiten.

Verwandte Themen