MySQL WHERE IN ()

85

Meine Anfrage lautet:

SELECT * FROM table WHERE id IN (1,2,3,4);

Ich benutze es für Benutzergruppen und ein Benutzer kann in mehr als einer Gruppe sein. Es scheint jedoch, dass mySQL diese Zeile nicht zurückgibt, wenn ein Datensatz mehrere IDs wie 1 und 3 hat.

Gibt es eine Möglichkeit, diese Reihe auch zu bekommen?

netcase
quelle
7
Bitte posten Sie ein Beispiel für die Zeilen, die von dieser Abfrage nicht ordnungsgemäß zurückgegeben werden. Vorausgesetzt , dass Sie nicht das sind die Speicherung idals durch Kommata getrennte Liste oder etwas, mehrere Zeilen werden aus der Abfrage zurück.
Michael Berkowski
1
Nun, es ist eine durch Kommas getrennte Liste, zum Beispiel => 3,4 wird von mySQL nicht zurückgegeben. Ich sehe das Problem, es geht um das Komma, aber wie könnte ich es tun?
Netcase
1
@ user762683, Bitte verwenden Sie einen richtigen Profilnamen? und was ist der Datentyp davon id, varchar oder set oder enum?
Starx
1
@Starx Welches Geschäft von Ihnen ist der Profilname, den jemand verwendet?
Michael Berkowski
1
@Michael, siehe Wie einfach und korrekt sind Klänge, die dem OP entsprechen, netcaseanstatt @user762683?
Starx

Antworten:

84

Ihre Anfrage wird übersetzt in

SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';

Es werden nur die Ergebnisse zurückgegeben, die damit übereinstimmen.


Eine Möglichkeit, die Komplexität zu vermeiden, besteht darin, den Datentyp auf zu ändern SET. Dann könnten Sie FIND_IN_SET verwenden

SELECT * FROM table WHERE FIND_IN_SET('1', id);
Starx
quelle
Fehler kann nicht reproduziert werden. Die angeforderte Abfrage funktioniert für mich. Ich bekomme ALLE Datensätze aus 'Tabelle' mit den aufgelisteten IDs.
BF
39

Sie haben ein falsches Datenbankdesign und sollten sich etwas Zeit nehmen, um etwas über die Datenbanknormalisierung ( Wikipedia / Stackoverflow ) zu lesen .

Ich nehme an, Ihr Tisch sieht ungefähr so ​​aus

TABLE
================================
| group_id | user_ids | name   |
--------------------------------
| 1        | 1,4,6    | group1 |
--------------------------------
| 2        | 4,5,1    | group2 |    

In Ihrer Tabelle mit Benutzergruppen stellt jede Zeile eine Gruppe dar, und in der user_idsSpalte haben Sie dieser Gruppe Benutzer-IDs zugewiesen.

Die normalisierte Version dieser Tabelle würde so aussehen

GROUP
=====================
| id       | name   |
---------------------
| 1        | group1 |
---------------------
| 2        | group2 |    

GROUP_USER_ASSIGNMENT
======================
| group_id | user_id |
----------------------
| 1        | 1       |
----------------------
| 1        | 4       |
----------------------
| 1        | 6       |
----------------------
| 2        | 4       |
----------------------
| ...      

Dann können Sie einfach alle Benutzer mit zugewiesener Gruppe oder alle Benutzer in der Gruppe oder alle Benutzergruppen oder was auch immer Sie sich vorstellen können auswählen. Außerdem funktioniert Ihre SQL-Abfrage:

/* Your query to select assignments */
SELECT * FROM `group_user_assignment` WHERE user_id IN (1,2,3,4);

/* Select only some users */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE user_id IN (1,4);

/* Select all groups of user */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`user_id` = 1;

/* Select all users of group */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`group_id` = 1;

/* Count number of groups user is in */
SELECT COUNT(*) AS `groups_count` FROM `group_user_assignment` WHERE `user_id` = 1;

/* Count number of users in group */
SELECT COUNT(*) AS `users_count` FROM `group_user_assignment` WHERE `group_id` = 1;

Auf diese Weise ist es auch einfacher, die Datenbank zu aktualisieren. Wenn Sie eine neue Zuordnung hinzufügen möchten, fügen Sie einfach eine neue Zeile ein group_user_assignment. Wenn Sie die Zuordnung entfernen möchten, löschen Sie einfach die Zeile in group_user_assignment.

In Ihrem Datenbankdesign müssten Sie zum Aktualisieren von Zuweisungen Ihren Zuweisungssatz aus der Datenbank abrufen, verarbeiten und aktualisieren und dann in die Datenbank zurückschreiben.

Hier ist sqlFiddle zum Spielen.

Buksy
quelle
2

Sie müssen einen Datensatz in der Tabelle oder einen Array-Datensatz in der Datenbank haben.

Beispiel:

SELECT * FROM tabel_record
WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);
Misbah Dino
quelle
Eine Unterauswahl ist nicht erforderlich. IN (1,2,3,4)ist vollkommen gültig. Außerdem verstehe ich nicht, wie dies in der Frage erklärt, "wenn ein Datensatz mehrere IDs wie 1 und 3 hat, gibt mySQL diese Zeile nicht zurück".
Scratte