[mysql] sorteren op count()

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
Hoi, ik heb de voglende tabel :
code:
1
2
3
4
5
6
7
8
9
10
CREATE TABLE `ck_koppel_toewijzing` (
  `id` int(255) NOT NULL auto_increment,
  `user_id1` int(255) NOT NULL default '0',
  `user_id2` int(255) NOT NULL default '0',
  `vaardigheid_id` int(255) NOT NULL default '0',
  `antwoord` varchar(255) NOT NULL default '',
  `competentie_id` int(255) NOT NULL default '0',
  `definitief` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

Nu wil ik kijken hoevaak een vaardigheid_id voorkomt en dit dan sorteren met het hoogte aantal boven aan (DESC). Maar dit lukt me dus niet. Op dit moment heb ik het voglende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$sql_resultaat = "SELECT DISTINCT vaardigheid_id FROM ck_koppel_toewijzing 
  WHERE competentie_id = '$_SESSION[session_user_id]' AND definitief = '1'";
  $query_resultaat = mysql_query($sql_resultaat) or die(mysql_error());
  
  while($resultaat = mysql_fetch_array($query_resultaat)){
  
    $sql_aantal = "SELECT count(*) AS aantal FROM ck_koppel_toewijzing
    WHERE vaardigheid_id = '$resultaat[vaardigheid_id]' ORDER BY aantal DESC";
    $query_aantal = mysql_query($sql_aantal) or die(mysql_error()); 
    $aantal = mysql_result($query_aantal,0); 
    echo "[ $resultaat[vaardigheid_id] ] aantal = $aantal <BR>";
}

Ik weet dat dit bij lange na niet goed is maar hoe dan wel ik heb al hier op GoT lopen zoeken naar "sorteren op count" en "order by count" en dan krijg je heel veel resultaten terug maar ik kan gewoon niet vinden wat ik zoek.

Het is dus de bedoeling dat je er op het eind zoiets uit krijt per vaardigheid _id het aantal gesorteerd op aantal.
code:
1
2
3
4
5
6
vaardigheid_id   aantal
4                 4
8                 3
1                 2
9                 2
2                 1

Wie kan mij een helpende hand bieden want ik wordt er ondertussen echt bedroeft van :'( ben er namelijk al best heel lang mee bezig.

[ Voor 9% gewijzigd door TwoR op 15-04-2004 11:25 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:36
Waarom wil je zo moeilijk doen?
Je kan dit met 1 sql statement verkrijgen. Kijk eens naar COUNT, group by, etc....

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Direct in je SQL code:

code:
1
2
SELECT vaardigheid_id, count(vaardigheid_id) as Aantal 
FROM Tabel GROUP BY vaardigheid_id ORDER BY count(vaardigheid_id)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Zoiets misschien?
code:
1
2
3
4
SELECT vaardigheid_id, count(*) as aantal
FROM ck_koppel_toewijzing
GROUP BY vaardigheid_id
ORDER BY count(*) DESC

Never underestimate the power of


  • _-= Erikje =-_
  • Registratie: Maart 2000
  • Laatst online: 18-05 14:38
Wat je wilt is alle rijen met dezelfde vaardigheid_id groeperen tot 1 groep en daarbinnen het aantal rijen bekijken.

Dit kan met 1 query

SQL:
1
2
3
4
5
SELECT      vaardigheid_id, 
                  count(*) AS aantal 
FROM         ck_koppel_toewijzing
GROUP BY  vaardigheid_id
ORDER BY  aantal DESC


[edit]
sneller tiepen en geen uitleg willen verzinnen, anders spuit 11 mode :P)

[ Voor 12% gewijzigd door _-= Erikje =-_ op 15-04-2004 11:35 ]


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
PHP:
1
2
3
4
5
6
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) as aantal 
          FROM ck_koppel_toewijzing  
          WHERE competentie_id = '$_SESSION[session_user_id]' AND definitief = '1'
          GROUP BY vaardigheid_id 
          ORDER BY count(vaardigheid_id)";
  $query = mysql_query($sql) or die(mysql_error());


Ik heb het nu zo, Dit had ik ook al eens geprobeerd alleen dan krijg je een foutmelding "Invalid use of group function"

Verwijderd

je moet wel opletten dat als je sorteert op COUNT of MAX etc je wel ` moet gebruiken
voorbeeldje:
code:
1
SELECT vaardigheid_id, count(vaardigheid_id)  FROM Tabel GROUP BY vaardigheid_id ORDER BY `count(vaardigheid_id)`

of
code:
1
SELECT vaardigheid_id, count(vaardigheid_id) AS aantal  FROM Tabel GROUP BY vaardigheid_id ORDER BY aantal


dat moet volgens mij ook werken

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
oke maar hoe komt het nou dat ie het niet goed sorteert ik krijg nu het volgende rijtje terug:
Tussen de [ haken ] is het vaardigheids id nummer en achter de = is het aantal maar zoals je ziet niet goed gesorteerd.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[ 4 ] aantal = 2 
[ 5 ] aantal = 2 
[ 6 ] aantal = 2 
[ 11 ] aantal = 2 
[ 15 ] aantal = 2 
[ 25 ] aantal = 1 
[ 7 ] aantal = 2 
[ 16 ] aantal = 2 
[ 30 ] aantal = 1 
[ 13 ] aantal = 2 
[ 19 ] aantal = 1 
[ 27 ] aantal = 1 
[ 29 ] aantal = 1 
[ 9 ] aantal = 1 
[ 26 ] aantal = 1 
[ 20 ] aantal = 1 
[ 18 ] aantal = 1 
[ 22 ] aantal = 1 
[ 23 ] aantal = 1

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:36
Er is gesorteerd op aantal, als je op id wilt sorteren moet je je order by clause aanpassen. :z

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Dat is toch goed? Het aantal ziet er tenminste gesorteerd uit.

Never underestimate the power of


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
nee het moet worden gesorteerd worden op aantal maar zoals je ziet is dat niet gebeurd hoe kan op regel 6 dan het aantal 1 zijn en daaronde weer 2

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Idd, je hebt gelijk. Welke query heb je nu eigenlijk gebruikt?

Never underestimate the power of


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
code:
1
2
3
4
5
6
7
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) as aantal 
          FROM ck_koppel_toewijzing  
          WHERE competentie_id = '$_SESSION[session_user_id]' AND definitief = '1'
          GROUP BY vaardigheid_id 
          ORDER BY 'count(vaardigheid_id)' DESC";
  $query = mysql_query($sql) or die(mysql_error());
  $aantal = mysql_result($query, 0);

Deze

[ Voor 8% gewijzigd door TwoR op 15-04-2004 12:25 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Misschien is dat een mysql iets, maar waarom moet je single quotes om de count() in het ORDER BY statement zetten? Het lijk me dat hij daarom niet sorteert op de werkelijke count, maar de string.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
oke het is gelukt maar ik heb nu toch weer 2 select statements
Dit is het nu geworden
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) AS aantal  
  FROM ck_koppel_toewijzing   
  GROUP BY vaardigheid_id 
  ORDER BY aantal DESC
  LIMIT 12";
 $query = mysql_query($sql) or die(mysql_error());
 
  while($resultaat = mysql_fetch_array($query)){
    
    $sql_aantal = "SELECT count(*) AS aantal FROM ck_koppel_toewijzing
    WHERE vaardigheid_id = '$resultaat[vaardigheid_id]'";
    $query_aantal = mysql_query($sql_aantal) or die(mysql_error()); 
    $aantal = mysql_result($query_aantal,0); 
    echo "[ $resultaat[vaardigheid_id] ] aantal = $aantal <BR>";
  }


Het rijtje dat er nu uitkomt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
[ 4 ] aantal = 2 
[ 11 ] aantal = 2 
[ 15 ] aantal = 2 
[ 7 ] aantal = 2 
[ 13 ] aantal = 2 
[ 10 ] aantal = 1 
[ 25 ] aantal = 1 
[ 3 ] aantal = 1 
[ 5 ] aantal = 1 
[ 12 ] aantal = 1 
[ 14 ] aantal = 1 
[ 16 ] aantal = 1

[ Voor 21% gewijzigd door TwoR op 15-04-2004 12:33 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
TwoR schreef op 15 april 2004 @ 12:33:
oke het is gelukt maar ik heb nu toch weer 2 select statements
Dit is het nu geworden
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) AS aantal  
  FROM ck_koppel_toewijzing   
  GROUP BY vaardigheid_id 
  ORDER BY aantal DESC
  LIMIT 12";
 $query = mysql_query($sql) or die(mysql_error());
 
  while($resultaat = mysql_fetch_array($query)){
    
    $sql_aantal = "SELECT count(*) AS aantal FROM ck_koppel_toewijzing
    WHERE vaardigheid_id = '$resultaat[vaardigheid_id]'";
    $query_aantal = mysql_query($sql_aantal) or die(mysql_error()); 
    $aantal = mysql_result($query_aantal,0); 
    echo "[ $resultaat[vaardigheid_id] ] aantal = $aantal <BR>";
  }
Ik ben blij dat je tevreden bent, maar dit is natuurlijk niet een goede oplossing. Je moet als het kan een sql query in een loop vermijden.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
Dat weet ik, maar aan de andere kant ben ik blij dat het in iedergeval werkt. Ik ga nog wel even uitzoeken hoe ik dit alles nou netter kan krijgen.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Komt het nou niet van die quotes? Als je die weghaalt, krijg je dan weer die foutmelding die je eerder gaf?

MySQL kan toch wel omgaan met aggregates in de order by clausule?

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

TwoR schreef op 15 april 2004 @ 12:24:
code:
1
2
3
4
5
6
7
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) as aantal 
          FROM ck_koppel_toewijzing  
          WHERE competentie_id = '$_SESSION[session_user_id]' AND definitief = '1'
          GROUP BY vaardigheid_id 
          ORDER BY 'count(vaardigheid_id)' DESC";
  $query = mysql_query($sql) or die(mysql_error());
  $aantal = mysql_result($query, 0);

Deze
als je mijn post goed had gelezen had je gezien dat er geen single quote stond maar zo'n ding links naast de 1 op je toetsenbord (`), en dan werkt het wel

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op 15 april 2004 @ 12:53:
[...]


als je mijn post goed had gelezen had je gezien dat er geen single quote stond maar zo'n ding links naast de 1 op je toetsenbord (`), en dan werkt het wel
offtopic:
wat doen zo'n ding dan? Is dat verplicht voor MySQL?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
Oke nu dit werkt wil ik graag aan de 'experts' nog een vraagje stellen.
Zoals in de tabel (ts) te zien is is er ook een kolom antwoord deze kan bestaan uit 3 verschillende basis,ervaren of excellent nu wil ik dat de 12 vaardigheid_id's die ik ondertussen heb worden verdeelt over deze 3 antwoorden maar dan moeten ze dus bij het antwoord komen te staan die het meest voorkomt. Ik hoop dat iemand dit snapt want het is lastig te omschrijven.

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:26

ripexx

bibs

P_de_B schreef op 15 april 2004 @ 12:54:
[...]


offtopic:
wat doen zo'n ding dan? Is dat verplicht voor MySQL?
Eenvoudiger is gewoon een alias gebruiken ;) Dus count(col) AS aantal en dan ORDER BY aantal

Veel eenvoudiger en voorkomt problemen met '," en ` :)

buit is binnen sukkel


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
ripexx schreef op 15 april 2004 @ 13:31:
[...]
Eenvoudiger is gewoon een alias gebruiken ;) Dus count(col) AS aantal en dan ORDER BY aantal
Veel eenvoudiger en voorkomt problemen met '," en ` :)
Zoals te zien in mijn post hoe ik het uiteindelijk had zie je ook dat ik dat heb. Het voorkomt inderdaad het probleem met de quotjes ' '

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
TwoR schreef op 15 april 2004 @ 13:30:
Oke nu dit werkt wil ik graag aan de 'experts' nog een vraagje stellen.
Zoals in de tabel (ts) te zien is is er ook een kolom antwoord deze kan bestaan uit 3 verschillende basis,ervaren of excellent nu wil ik dat de 12 vaardigheid_id's die ik ondertussen heb worden verdeelt over deze 3 antwoorden maar dan moeten ze dus bij het antwoord komen te staan die het meest voorkomt. Ik hoop dat iemand dit snapt want het is lastig te omschrijven.
Dit is met GROUP BY wel op te lossen. Ik kan je aanraden eens een SQL Tutorial over group by door te nemen. Volgens mij staat in de FAQ van Programming & Webscripting ook een uitleg.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
goup by d'oh dat ik daar zelf niet even opkom :?

Ik zal eens even wat prutsen.

Verwijderd

Het antwoord op jouw kwestie is al lang aangedragen! Zie onderstaand:
_-= Erikje =-_ schreef op 15 april 2004 @ 11:34:
SQL:
1
2
3
4
5
SELECT    vaardigheid_id,
          count(*) AS aantal
FROM      ck_koppel_toewijzing
GROUP BY  vaardigheid_id
ORDER BY  aantal DESC

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
oke nog even over me eerste probleem:
als ik dit doe :
code:
1
2
3
4
5
6
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) AS aantal  
  FROM ck_koppel_toewijzing   
  GROUP BY vaardigheid_id 
  ORDER BY aantal DESC
  LIMIT 12";
 $query = mysql_query($sql) or die(mysql_error());

dan sorteert hij goed maar als ik er ook nog een WHERE ingooi op de volgende manier:
code:
1
2
3
4
5
6
7
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) AS aantal  
  FROM ck_koppel_toewijzing   
  WHERE definitief = '1' AND competentie_id  = '$_SESSION[session_user_id]'
  GROUP BY vaardigheid_id 
  ORDER BY aantal DESC
  LIMIT 12";
 $query = mysql_query($sql) or die(mysql_error());

Dan is de sorteer volgorder ineens niet meer goed. Is dit nu een bug in MySQL of doe ik echt iets verkeerd?

Het zit hem hier trouwens in definitief = '1' Als die erbij staat wordt er ineens niet meer goed gesorteerd. Als ik ipv AND definitief = '1' OR gebruik doet ie het ineens ook weer goed. Maar volgens mij moet her toch echt AND staan.

[ Voor 20% gewijzigd door TwoR op 15-04-2004 13:58 ]


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:26

ripexx

bibs

TwoR schreef op 15 april 2004 @ 13:54:
code:
1
2
3
4
5
6
7
$sql = "SELECT vaardigheid_id, count(vaardigheid_id) AS aantal  
  FROM ck_koppel_toewijzing   
  WHERE definitief = 1 AND competentie_id  = ".$_SESSION[session_user_id]."
  GROUP BY vaardigheid_id 
  ORDER BY aantal DESC
  LIMIT 12;";
 $query = mysql_query($sql) or die(mysql_error());
Even wat kleine dingen aangepast, je waarden van definitie en competentie_id zijn integers en worden dus gebruikt zonder quotes. De WHERE is in principe gewoon goed dus daar ligt het niet aan.

buit is binnen sukkel


  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 15:17

TwoR

Gekleurde stippen

Topicstarter
De quotes maken niks uit, de aantallen blijven verkeerd gesorteerd. Ik snap er ondertussen echt helemaal niks meer van :(

  • kokorico
  • Registratie: Januari 2004
  • Laatst online: 17-05 10:39
Ik zit met hetzelfde probleem als jou ...
Weet iemand opllossing?

[ Voor 71% gewijzigd door kokorico op 13-11-2004 22:46 ]

Pagina: 1