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?
id
als durch Kommata getrennte Liste oder etwas, mehrere Zeilen werden aus der Abfrage zurück.id
, varchar oder set oder enum?netcase
anstatt@user762683
?Antworten:
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 verwendenSELECT * FROM table WHERE FIND_IN_SET('1', id);
quelle
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_ids
Spalte 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 ingroup_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.
quelle
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);
quelle
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".