Sql Code
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.
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
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 schreef op 25.04.2009 19:41:
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 schreef op 25.04.2009 20:06:
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.
?
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.
Stel nu dat er maar 6 gebruikersnamen zijn die meer dan 4 keer voorkomen, dan zal uw query nog steeds 10 gebruikersnamen teruggeven.
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