MySQL GDZIE W ()

87

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?

netcase
źródło
7
Prześlij przykład wierszy, które nie zwracają się poprawnie z tego zapytania. Zakładając, że nie są składowano idjako listę oddzielonych przecinkami lub czegoś, wiele wierszy będzie powrócić z zapytaniem.
Michał Berkowski
1
cóż, jest to lista oddzielona przecinkami, na przykład => 3,4 nie zostanie zwrócone przez mySQL. Widzę problem, chodzi o przecinek, ale jak mogłem to zrobić?
netcase
1
@ user762683, Użyj prawidłowej nazwy profilu? i jaki jest typ danych this id, varchar lub set lub enum?
Starx
1
@Starx Jaką Twoją firmą jest nazwa profilu, której ktoś używa?
Michał Berkowski
1
@Michael, zobacz Jak łatwo i poprawnie są dźwięki odpowiadające OP jako netcasezamiast @user762683?
Starx

Odpowiedzi:

85

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_SET

SELECT * FROM table WHERE FIND_IN_SET('1', id);
Starx
źródło
Nie można odtworzyć żadnego błędu. Żądane zapytanie działa dla mnie. Otrzymuję WSZYSTKIE rekordy z „tabeli” z wymienionymi identyfikatorami.
BF
39

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_idskolumnie 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 wiersz group_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.

Buksy
źródło
2

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);
misbah dino
źródło
Podselekcja nie jest wymagana. 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.
Scratte