Sql Code
Met welke query is het mogelijk om het volgende te doen:
Ik heb een tabel met duidenden records, nu wil ik dat hij alleen de gebruikers weergeeft die meer dan vier keer in de database voorkomen
Nu moet de query 'steen' wel ophalen, maar 'anders' niet.
Ik heb een tabel met duidenden records, nu wil ik dat hij alleen de gebruikers weergeeft die meer dan vier keer in de database voorkomen
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
id | gebruikersnaam
------------------
1 | steen
2 | steen
3 | steen
4 | steen
5 | anders
6 | steen
------------------
1 | steen
2 | steen
3 | steen
4 | steen
5 | anders
6 | steen
Nu moet de query 'steen' wel ophalen, maar 'anders' niet.
COUNT?
Waarom wil je dit? Volgens mij klopt je datamodel niet.
Misschien niet de beste methode... maar hij werkt wel...
Hoewel ik daar niet zeker van ben met grote aantallen... :-(
Harry
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$dt = 0;
$sql = "SELECT id FROM tabel";
$sql_result = mysql_query($sql) or die("Kan gegevens niet verwerken1");
while($data = mysql_fetch_row($sql_result))
{
$dt = $dt + 1;
$alle_ids[$dt] = strtolower($data[0]);
}
// filteren multiples
for($c = 2; $c <= $dt; $c++) // start met de tweede string
{
for($f = 1; $f < $c; $f++) // controleer of er voorgaand een multiple is
{
if($alle_ids[$c] == $alle_ids[$f]) // zo ja...
{
unset($alle_ids[$c]); // maak leeg!
}
}
}
// opslaan gefilterde ids
for($lz = 1; $lz <= $dt; $lz++)
{
if($alle_ids[$lz]) // opslaan wanneer een waarde bevat
{
$sql = "INSERT INTO anderetabel (id) VALUES ('$alle_ids[$lz]')";
$sql_result = mysql_query($sql) or die ("Kan gegevens niet verwerken2");
}
}
$sql = "SELECT id FROM tabel";
$sql_result = mysql_query($sql) or die("Kan gegevens niet verwerken1");
while($data = mysql_fetch_row($sql_result))
{
$dt = $dt + 1;
$alle_ids[$dt] = strtolower($data[0]);
}
// filteren multiples
for($c = 2; $c <= $dt; $c++) // start met de tweede string
{
for($f = 1; $f < $c; $f++) // controleer of er voorgaand een multiple is
{
if($alle_ids[$c] == $alle_ids[$f]) // zo ja...
{
unset($alle_ids[$c]); // maak leeg!
}
}
}
// opslaan gefilterde ids
for($lz = 1; $lz <= $dt; $lz++)
{
if($alle_ids[$lz]) // opslaan wanneer een waarde bevat
{
$sql = "INSERT INTO anderetabel (id) VALUES ('$alle_ids[$lz]')";
$sql_result = mysql_query($sql) or die ("Kan gegevens niet verwerken2");
}
}
Hoewel ik daar niet zeker van ben met grote aantallen... :-(
Harry
Gewijzigd op 01/01/1970 01:00:00 door Harry
De opmerking over dat databasemodel niet klopt trek ik in twijfel. Het slaat namenlijk nergens op. Het enige wat er aan scheelt is `waarom` kunnen er in de tabel `dubbele` records op het veld gerbuikersnaam geinsert worden.
En wat Harry gepost heef dat is helemaal van de tandjes, je kan met 1 sql statement voor het een en ander zorg dragen.
En wat Harry gepost heef dat is helemaal van de tandjes, je kan met 1 sql statement voor het een en ander zorg dragen.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
SELECT username, COUNT(username) AS num_users
FROM table
GROUP BY table.username
HAVING num_users > 4
?>
SELECT username, COUNT(username) AS num_users
FROM table
GROUP BY table.username
HAVING num_users > 4
?>
Zoiets?
Waarom zou het datamodel niet kloppen? Denk maar aan posts, wanneer je alleen de gebruikers met meer dan bijvoorbeeld 500 posts wilt laten zien heb je ongeveer hetzelfde nodig als waarnaar ik vraag. Volgens mij komt stien het dichtst in de buurt, even uitproberen.
Ik zou eerder de userID opslaan, in plaats van de username. De userID koppel je aan een tabel met alle gebruikers daarin, dus gekoppeld aan het id veld in de gebruikers tabel. Denk toch wel dat je een beetje overbodige data opslaat...
GaMer13, dit is maar een voorbeeld, het gaat om een veld die ik verder niet gebruik. De methode van stien werkt inderdaad!
'Noppes:
En wat Harry gepost heef dat is helemaal van de tandjes, je kan met 1 sql statement voor het een en ander zorg dragen.
En wat Harry gepost heef dat is helemaal van de tandjes, je kan met 1 sql statement voor het een en ander zorg dragen.
Oh, dat geloof ik best, ik ben niet zo'n kei in het korte sql statement gebeuren maar probeer het wel op te lossen, dan al niet met een omweg.
In ieder geval leer ik weer van jullie korte oplossingen!
Bedankt Stien!
EDIT:
Heb je toevallig ook de oplossing voor mijn vraag?
Gewijzigd op 01/01/1970 01:00:00 door Harry
'steen:
Wat dacht je dan van: Waarom zou het datamodel niet kloppen? Denk maar aan posts, wanneer je alleen de gebruikers met meer dan bijvoorbeeld 500 posts wilt laten zien heb je ongeveer hetzelfde nodig als waarnaar ik vraag. Volgens mij komt stien het dichtst in de buurt, even uitproberen.
?
In dat geval houd je redundante informatie bij. Je telt gewoon het aantal reacties uit de reactietabel, behorende bij een bepaalde userid.
Dit hoef je niet apart bij te houden. Mocht je dat toch per se willen, gebruik dan gewoon VIEWS.
Dit hoef je niet apart bij te houden. Mocht je dat toch per se willen, gebruik dan gewoon VIEWS.
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
Code (php)
1
2
3
4
2
3
4
SELECT gebruikersnaam, COUNT(gebruikersnaam) AS aantal
FROM tabel
ORDER BY aantal
LIMIT 0, 10
FROM tabel
ORDER BY aantal
LIMIT 0, 10
De code van Stien zal waarschijnlijk hetzelfde geven, maar deze is (volgens mij) iets sneller.
@Eddy: Als dit zou sneller zijn kan ik zo niet oordelen, maar juiste informatie is bij jou niet gegarandeerd..
Stel nu dat er maar 6 gebruikersnamen zijn die meer dan 4 keer voorkomen, dan zal uw query nog steeds 10 gebruikersnamen teruggeven.
Stel nu dat er maar 6 gebruikersnamen zijn die meer dan 4 keer voorkomen, dan zal uw query nog steeds 10 gebruikersnamen teruggeven.
Daar heb je inderdaad wel een punt. Mocht dat zo zijn, dan is de oplossing van Stien beter.
Maar dat zal waarschijnlijk niet het geval zijn...
HAVING is nogal zwaar vergeleken met een LIMIT. Vandaar.
Maar dat zal waarschijnlijk niet het geval zijn...
HAVING is nogal zwaar vergeleken met een LIMIT. Vandaar.
De oplossing van stien is de enige juiste




