2016-07-16 15 views
0

Ich ist die folgende in MySQL/PHPMySQL + PHP WHERE IN (Liste von Zahlen) nur für die erste Zahl in der Liste arbeiten

SELECT * FROM `uc_posts` WHERE `postinguser` IN (SELECT `following` FROM `uc_users` WHERE `id` = 1) ORDER BY id DESC LIMIT 20 

Der Wert following läuft 1,2

jedoch für einige Grund ist nur die Zeilen anzeigt, wo die postinguser ist 1

Um zu bestätigen, wenn ich laufe:

(SELECT `following` FROM `uc_users` WHERE `id` = 1) 

Es die Zelle following mit dem Inhalt 1,2

kehrt Was seltsam ist, wenn ich laufe dies:

SELECT * FROM `uc_posts` WHERE `postinguser` IN (1,2) ORDER BY id DESC LIMIT 20 

Es das gewünschte Ergebnis mit Reihen mit beiden postinguser1 und 2

Die zurück Die Spalte following ist als varchar(255) utf8_general_ci

strukturiert 10

Können Sie sehen, was hier falsch ist?

Danke.

+1

'WHERE IN' stimmt genau überein, analysiert das Ergebnis nicht als eine durch Kommas getrennte Liste. – Barmar

Antwort

1

Sie sollten Listen mit Zahlen in einer einzelnen Spalte nicht als getrennte Liste speichern. SQL hat eine großartige Datenstruktur zum Speichern von Listen; es heißt Tabelle, keine Zeichenfolge Spalte.

In Ihrem Fall ist der Wert '1,2' genau so, wie es aussieht: eine einzelne Zeichenfolge. Es wird eine andere Zeichenfolge mit drei Zeichen übereinstimmen, eine Eins, ein Komma und zwei.

Manchmal sind wir mit schlechten Designentscheidungen anderer Menschen festgefahren. Wenn ja, könnten Sie den Zustand schreiben als:

SELECT p.* 
FROM `uc_posts` p 
WHERE EXISTS (SELECT 1 
       FROM `uc_users` 
       WHERE `id` = 1 AND find_in_set(postinguser, following) > 0 
      ) 
ORDER BY id DESC 
LIMIT 20; 

Aber ich möchte Sie ermutigen, Ihre Datenstruktur zu ändern, so dass Sie eine regelmäßige JOIN verwenden können. Die Leistung ist viel besser, wenn Sie die richtigen Datenstrukturen verwenden.

+0

Das hat super funktioniert, danke! Ja, ich lerne immer noch, während ich gehe, ich dachte, es hätte etwas mit dem String-Element zu tun gehabt, deshalb habe ich über die Struktur der Spalte geschrieben. Daran werde ich mich für das nächste Mal erinnern. – Ben

Verwandte Themen