MySQL SELECT Anweisung, WHERE 'IN' Klausel

7

Ich habe derzeit die folgende Zeile in meiner Tabelle:

%Vor%

und ich versuche, die folgende SELECT-Anweisung zu implementieren:

%Vor%

Grundsätzlich möchte ich, dass diese Zeile (mit Benutzer 405) weggelassen wird, wenn die Variable $ day eine '1, 3 oder 5' enthält.

Wenn beispielsweise $day = "1" zurückgegeben wird, sollte eine leere Abfrage zurückgegeben werden (weil die Zahl "1" in der Spalte "1,3,5" steht).

Allerdings habe ich nicht gefunden, dass dies der Fall ist. Obwohl $day = "1" zurückgegeben wird, wird diese Zeile trotzdem zurückgegeben.

Die einzige Möglichkeit, dass die Zeile nicht zurückgegeben wird, ist $day= "1,3,5." Dennoch dachte ich, dass die IN () -Klausel irgendeinen Teil meiner Variablen übernehmen und auf diese Spalte anwenden würde.

Irgendwelche Erkenntnisse darüber, was ich hier falsch mache? Danke.

    
Dodinas 18.10.2009, 21:33
quelle

5 Antworten

11

Sie sollten das like -Schlüsselwort dafür verwenden teilweise Übereinstimmung des Char-Feldes:

%Vor%

Bearbeiten: Sowohl VolkerK als auch Lukas Lalinsky schlagen MySQL find_in_set vor, was wahrscheinlich besser als like für das ist, was Sie tun möchten. Die folgende Empfehlung zur Normalisierung Ihrer Datenbank gilt jedoch weiterhin.

Sie sollten jedoch nicht mehrere Werte in einem einzelnen Datenbankfeld speichern. Verwenden Sie stattdessen zwei Tabellen:

%Vor%

Dann hätten Sie die folgenden Daten:

%Vor%

Sie können dieses Schema dann korrekt abfragen. Zum Beispiel:

%Vor%

(oder, das sollte nahe sein; ich bin nicht genau sicher, was Sie erreichen möchten oder wie der Rest Ihres Schemas aussieht, also ist dies eine gute Schätzung).

    
James McNellis 18.10.2009, 21:49
quelle
14

Entfernen Sie die Anführungszeichen in der IN-Anweisung. Die Syntax ist:

%Vor%

und nicht wie du es benutzt hast

%Vor%

Siehe auch die Dokumentation zu IN, es gibt weitere Beispiele .

    
theomega 18.10.2009 21:34
quelle
5

Ich denke, die gewünschte Abfrage lautet:

%Vor%

Aber Sie sollten ernsthaft in Betracht ziehen, die Datenbank zu normalisieren, so dass jeder Tag eine eigene Zeile hat.

    
Lukáš Lalinský 18.10.2009 21:52
quelle
2

Wenn ich Ihre Frage richtig verstehe, möchten Sie, dass der Inhalt des varchar-Feldes als kommagetrennte Liste behandelt wird und testen Sie, ob diese Liste einen bestimmten Wert enthält. Dafür benötigen Sie die find_in_set (str, strlist) Funktion.
Bedenken Sie jedoch, dass MySQL in diesem Fall keinen Index verwenden kann und Ihre Abfrage immer einen vollständigen Tabellenscan benötigt. Es könnte besser sein, strukturierte Daten nicht in einer einzelnen Spalte zu speichern (und Vergleiche für die einzelnen Elemente auszuführen), sondern eine andere Tabelle und einen JOIN zu verwenden, wie es in anderen Antworten vorgeschlagen wurde.

    
VolkerK 18.10.2009 21:49
quelle
0

Tage enthält keine Liste von Zeichenfolgen. Es enthält eine einzelne Zeichenfolge. Ist die Saite "1,3,5" in einer der Saiten in {'1'}? Offensichtlich ist die Antwort nein. Entweder Refactor Tage in eine andere Tabelle oder bereit sein, mehr String-Manipulation zu tun

    
Yuliy 18.10.2009 21:45
quelle

Tags und Links