MySQL: Ordine după număr(*)? (Programare, Mysql, Sql, Bază De Date, Vbulletin, Sql Order By)

Govind Parmar a intrebat.

Am o tabelă cu următoarea structură (unii dintre voi poate o recunosc ca parte a unei instalări standard vBulletin):

mysql> SHOW CREATE TABLE adminlogG
*************************** 1. row ***************************
       Table: adminlog
Create Table: CREATE TABLE `adminlog` (
  `adminlogid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned NOT NULL DEFAULT '0',
  `dateline` int(10) unsigned NOT NULL DEFAULT '0',
  `script` varchar(50) NOT NULL DEFAULT '',
  `action` varchar(20) NOT NULL DEFAULT '',
  `extrainfo` varchar(200) NOT NULL DEFAULT '',
  `ipaddress` varchar(15) NOT NULL DEFAULT '',
  PRIMARY KEY (`adminlogid`),
  KEY `script_action` (`script`,`action`)
) ENGINE=MyISAM AUTO_INCREMENT=698189 DEFAULT CHARSET=latin1
1 row in set (0.02 sec)

mysql>

Următoarea interogare în PHP ar selecta scripturile distincte utilizate de un anumit utilizator:

"SELECT DISTINCT script FROM adminlog WHERE userid = " . intval($userid)

Cum pot face ca interogarea să ordoneze scripturile în funcție de numărul de apariții (pentru acel userid specific), descrescător? ORDER BY COUNT(*) nu face acest lucru.

2 răspunsuri
Angelo Saleh

Cred că ați putea rezolva acest lucru cu group și count.

SELECT count(script) ocurrences, script FROM adminlog GROUP BY script ORDER BY ocurrences DESC;

aici aveți un link pentru testare

http://sqlfiddle.com/#!2/b6f78/8

ozborn

ORDER BY COUNT(*) ar trebui să funcționeze, dar scapă de DISTINCT.

Încercați:

"SELECT script FROM adminlog WHERE userid = " . intval($userid)
. "GROUP BY script ORDER BY COUNT(*)"