Masz zły projekt bazy danych i należy wziąć czas na przeczytanie czegoś o normalizacji baz danych (wikipedia/stackoverflow).
I zakładamy, że stół wygląda nieco jak to
TABLE
================================
| group_id | user_ids | name |
--------------------------------
| 1 | 1,4,6 | group1 |
--------------------------------
| 2 | 4,5,1 | group2 |
tego w spisie grup użytkowników, każdy wiersz reprezentuje jedną grupę i user_ids
kolumnie ustawiono identyfikatorów użytkowników przypisanych do tej grupy.
Znormalizowany wersja tej tabeli będzie wyglądać następująco
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żna łatwo wybrać wszystkie użytkownikom przypisanym grupie lub wszystkich użytkowników w grupie lub wszystkich grup użytkowników, czy cokolwiek można myśleć z. Również 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;
ten sposób będzie również łatwiejsze do aktualizacji bazy danych, jeśli chcesz dodać nowe zadanie, po prostu wystarczy wstawić nowy wiersz w group_user_assignment
, gdy chcesz usunąć przypisanie po prostu usuwasz wiersz w group_user_assignment
.
W projekcie bazy danych, aby zaktualizować przypisania, należy pobrać zestaw przydziałów z bazy danych, przetworzyć go i zaktualizować, a następnie zapisać w bazie danych.
Oto sqlFiddle do zabawy.
Proszę podać przykład wierszy, które nie zwracają prawidłowo z tego zapytania. Zakładając, że nie przechowujesz "id" jako listy rozdzielanej przecinkami lub czegoś takiego, wiele wierszy _will_ zwróci z zapytania. –
cóż, jest to oddzielna przecinka lista, na przykład => 3,4 nie zostanie zwrócone przez mySQL. Widzę problem, chodzi o przecinek, ale jak mogłem to zrobić? – netcase
@ user762683, Proszę użyć poprawnej nazwy profilu? i jaki jest typ danych tego 'id', varchar lub set lub enum? – Starx