In een testomgeving, wil ik graag een database vullen met testdata uit een andere tabel.
Brontabel is een tabel met een log van ingelogde gebruikers. Doel is om op basis van die tabel de 30 meest ingelogde gebruikers te selecteren, en die in te voegen in de tabel van de testdatabase.
Het maken van een top 30 is niet al te moeilijk:
Dit levert een resultset op met 4 kolommen. De laatste kolom bevat een nummer dat aangeeft hoe vaak een bepaald User ID voorkwam in de log. Hierop kan ik vervolgens weer sorteren om een top 30 te maken.
Nu wil ik de output van deze query graag weer gebruiken, om een INSERT te doen op een andere tabel.
Probleem: MySQL vind dat de SELECT een kolom teveel heeft. Dat klopt opzich. Hoe kan ik toch een top 30 maken aan de hand van die telling, zonder dat MySQL denkt dat ik de waarde van die kolom ergens kwijt moet in de INSERT?
Limitaties: het is de bedoeling dat het een enkele query blijft, en niet twee queries met wat scripting ertussen.
Brontabel is een tabel met een log van ingelogde gebruikers. Doel is om op basis van die tabel de 30 meest ingelogde gebruikers te selecteren, en die in te voegen in de tabel van de testdatabase.
Het maken van een top 30 is niet al te moeilijk:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| SELECT log.userid, log.a log.b COUNT(log.userid) AS id_occurance_count, FROM db2.logdata AS log GROUP BY log.userid ORDER BY id_occurance_count DESC LIMIT 30; |
Dit levert een resultset op met 4 kolommen. De laatste kolom bevat een nummer dat aangeeft hoe vaak een bepaald User ID voorkwam in de log. Hierop kan ik vervolgens weer sorteren om een top 30 te maken.
Nu wil ik de output van deze query graag weer gebruiken, om een INSERT te doen op een andere tabel.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| INSERT INTO db1.users (id, a, b) SELECT log.userid, log.a log.b COUNT(log.userid) AS id_occurance_count, FROM db2.logdata AS log GROUP BY log.userid ORDER BY id_occurance_count DESC LIMIT 30; |
Probleem: MySQL vind dat de SELECT een kolom teveel heeft. Dat klopt opzich. Hoe kan ik toch een top 30 maken aan de hand van die telling, zonder dat MySQL denkt dat ik de waarde van die kolom ergens kwijt moet in de INSERT?
Limitaties: het is de bedoeling dat het een enkele query blijft, en niet twee queries met wat scripting ertussen.