Wie kan mij helpen om een query te maken voor een SQL database van een joomla website.
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
je wilt elke user die vaker voorkomt (in welke groen danook) uit groep 18 gooien?

Ja, dat klopt.
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.
Hiermee zou je alle vaker voorkomende userid's vinden:

SELECT user_id , COUNT(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


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
)


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.

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


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
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;


[/code]
Wel met HAVING COUNT(1) > 1 ipv > 0

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
Meestal slaap ik 's nachts ....
Zal het ff aanpassen.
Hier mee gedaan:

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.

Reageren