dubbele user_id's in database
Momenteel hebben wij dubbele user_id's.
In lg3u5_user_usergroup_map staan 2 kolommen.
Eén kolom met user_id's, en één kolom met group_id.
Sommige user_id's zijn dubbel en hebben ieder een group_id.
Nu had ik graag de dubbele user_id's met de group_id 18 verwijderd.
Voorbeeld:
user_id group_id
3000 2
3000 18
3001 2
3002 2
3002 18
Gewijzigd op 03/03/2014 15:44:54 door Jos Bongers
je wilt elke user die vaker voorkomt (in welke groen danook) uit groep 18 gooien?
Er zijn veel user_id's dubbel.
Bijv user_id 3000 staat er 2 keer in.
1 maal met group_id 18 en nog eens met group_id 2.
Dan wil ik dus de User_id 3000 met group_id 18 verwijderen.
Maar die met group_id 2 moet staan blijven.
Code (php)
1
2
3
4
2
3
4
SELECT user_id , COUNT(1)
FROM lg3u5_user_usergroup_map
GROUP BY user_id
HAVING COUNT(1) > 1
FROM lg3u5_user_usergroup_map
GROUP BY user_id
HAVING COUNT(1) > 1
Dan wil je dat resultaat gebruiken om ze te verwijderen, incombi met group_id 18
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
DELETE FROM lg3u5_user_usergroup_map 3
WHERE group_id = 18
AND user_id IN
(
SELECT user_id
FROM lg3u5_user_usergroup_map
GROUP BY user_id
HAVING COUNT(1) > 1
)
WHERE group_id = 18
AND user_id IN
(
SELECT user_id
FROM lg3u5_user_usergroup_map
GROUP BY user_id
HAVING COUNT(1) > 1
)
Het zou kunnen dat Mysql het niet leuk vindt om te deleten uit dezelfde tabel als waaruit de subquery resultaten haalt.
In dat geval zou je met 2 query's kunnen werken waarbij je de IN() door PHP laat vullen.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
DELETE FROM lg3u5_user_usergroup_map
WHERE user_id IN
(SELECT user_id FROM
lg3u5_user_usergroup_map
GROUP BY user_id HAVING COUNT(*) > 0)
AND group_id = 18
WHERE user_id IN
(SELECT user_id FROM
lg3u5_user_usergroup_map
GROUP BY user_id HAVING COUNT(*) > 0)
AND group_id = 18
Toevoeging op 03/03/2014 17:31:02:
Ivo je hebt gelijk, subquery's op de zelfde tabel mogen niet in write query's.
Niet bij stil gestaan, zo kan het wel
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
CREATE TEMPORARY TABLE tmp_table (user_id INT NOT NULL);
INSERT INTO tmp_table SELECT user_id FROM
lg3u5_user_usergroup_map
GROUP BY user_id HAVING COUNT(*) > 1;
DELETE FROM lg3u5_user_usergroup_map
WHERE user_id IN
(SELECT user_id FROM
tmp_table)
AND group_id = 18;
INSERT INTO tmp_table SELECT user_id FROM
lg3u5_user_usergroup_map
GROUP BY user_id HAVING COUNT(*) > 1;
DELETE FROM lg3u5_user_usergroup_map
WHERE user_id IN
(SELECT user_id FROM
tmp_table)
AND group_id = 18;
Gewijzigd op 03/03/2014 18:27:30 door Ger van Steenderen
Anders wis je ook de user_id die alleen bij Group 18 voorkomen en dus niet dubbel waren.
(anders zou de query een heel stuk simpler kunnen met
DELETE .. WHERE groupd_id = 18
Zal het ff aanpassen.
CREATE TEMPORARY TABLE tmp_table (user_id INT NOT NULL);
INSERT INTO tmp_table SELECT user_id FROM
lg3u5_user_usergroup_map
GROUP BY user_id HAVING COUNT(*) > 1;
DELETE FROM lg3u5_user_usergroup_map
WHERE user_id IN
(SELECT user_id FROM
tmp_table)
AND group_id = 18;
Werkte PERFECT jongens, hartelijk bedankt.