Moje zapytanie to:
SELECT * FROM table WHERE id IN (1,2,3,4);
Używam go do grup użytkowników, a użytkownik może należeć do więcej niż jednej grupy. ale wydaje się, że gdy rekord ma wiele identyfikatorów, takich jak 1 i 3, mySQL nie zwraca tego wiersza.
Czy jest jakiś sposób, aby uzyskać ten wiersz?
id
jako listę oddzielonych przecinkami lub czegoś, wiele wierszy będzie powrócić z zapytaniem.id
, varchar lub set lub enum?netcase
zamiast@user762683
?Odpowiedzi:
Twoje zapytanie zostanie przetłumaczone na
SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';
Zwróci tylko wyniki, które do niego pasują.
Jednym ze sposobów rozwiązania tego problemu, unikając złożoności, jest zmiana typu danych na
SET
. Wtedy możesz użyć FIND_IN_SETSELECT * FROM table WHERE FIND_IN_SET('1', id);
źródło
Masz nieprawidłowy projekt bazy danych i powinieneś poświęcić trochę czasu na przeczytanie czegoś o normalizacji bazy danych ( wikipedia / stackoverflow ).
Zakładam, że twój stół wygląda mniej więcej tak
TABLE ================================ | group_id | user_ids | name | -------------------------------- | 1 | 1,4,6 | group1 | -------------------------------- | 2 | 4,5,1 | group2 |
więc w Twojej tabeli grup użytkowników każdy wiersz reprezentuje jedną grupę, aw
user_ids
kolumnie masz zestaw identyfikatorów użytkowników przypisanych do tej grupy.Tak wyglądałaby znormalizowana wersja tej tabeli
GROUP ===================== | id | name | --------------------- | 1 | group1 | --------------------- | 2 | group2 | GROUP_USER_ASSIGNMENT ====================== | group_id | user_id | ---------------------- | 1 | 1 | ---------------------- | 1 | 4 | ---------------------- | 1 | 6 | ---------------------- | 2 | 4 | ---------------------- | ...
Następnie możesz łatwo wybrać wszystkich użytkowników z przypisaną grupą lub wszystkich użytkowników w grupie, wszystkie grupy użytkowników lub cokolwiek przyjdzie Ci do głowy. Również twoje zapytanie sql będzie działać:
/* 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;
W ten sposób łatwiej będzie również zaktualizować bazę danych, gdy chcesz dodać nowe przypisanie, po prostu wstaw nowy wiersz
group_user_assignment
, a jeśli chcesz usunąć przypisanie, po prostu usuwasz wierszgroup_user_assignment
.W projekcie bazy danych, aby zaktualizować przypisania, należałoby pobrać zestaw przydziałów z bazy danych, przetworzyć go i zaktualizować, a następnie zapisać z powrotem w bazie danych.
Oto sqlFiddle do zabawy.
źródło
musisz mieć rekord w tabeli lub rekord tablicy w bazie danych.
przykład:
SELECT * FROM tabel_record WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);
źródło
IN (1,2,3,4)
jest całkowicie poprawne. Nie rozumiem też, jak to wyjaśnia „kiedy rekord ma wiele identyfikatorów, takich jak 1 i 3, mySQL nie zwraca tego wiersza” w pytaniu.