从MySQL列中查找最常见的数据值?

时间:2011-08-16 10:26:51

标签: php mysql autosuggest

我正在尝试将音乐建议应用程序集成到我当前的音乐评级应用程序中。我正在寻找一种根据当前口味推荐音乐的方法。

我在iPod上写这个问题,所以格式化可能不对,所以我会解释这些专栏。

rate_idusernameartisttype(男/女/混合),song_idsongname,{{1} },genreyearlike

例如,一个人喜欢4首曲目,这个查询是:

dislike

返回:

SELECT * FROM rates WHERE username='$_SESSION['username']' LIMIT 4 ORDER BY id

好的,从这种评分模式来看,我们知道mrexample大多喜欢2010年写的女性流行歌曲,所以根据这些数据,我们会对用户生成的音乐收藏数据库形成一个查询:

1   | mrexample | Katy Perry    | F | 55 | Firework     | Pop | 2010 | 1 | 0
78  | mrexample | Lady Gaga     | F | 36 | Pokerface    | Pop | 2010 | 1 | 0
95  | mrexample | Nelly         | F | 96 | Just a Dream | Pop | 2010 | 1 | 0
106 | mrexample | Justin Bieber | M | 78 | Baby         | Pop | 2010 | 1 | 0

现在,我的问题是:如何从大量有关该人费率的数据中找出常见数据是什么?

我认为必须有一个mysql命令,但我不确定:/

如果一部分流行的部分是艺术家的话,我想到了如果陈述,不可能,太多的可能性,我们的数据库中有很多艺术家。切换,同样的事情。伯爵,没什么特别的,我可以数。我可以将mysql num行反对if,而且 - 太多了,无法处理。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

此查询为您提供用户最喜欢的流派。如果您想计入其他参数,例如'type',您需要为其定义公式并相应地更改此查询。

SELECT genre FROM rates
  WHERE username = '$_SESSION["username"]'
  GROUP BY genre
  ORDER BY COUNT(*) DESC
  LIMIT 1  

答案 1 :(得分:0)

微不足道......

SELECT type, genre, year, (SUM(like)-SUM(dislike))/COUNT(*)
FROM rates
WHERE username='$escaped_username'
GROUP BY type, genre, year
ORDER BY (SUM(like)-SUM(dislike))/COUNT(*) DESC
LIMIT 0,1

但是你可能想要允许的情况下,特别是年份之间没有太大的区别......

SELECT * 
FROM (
SELECT type, genre, year, (SUM(like)-SUM(dislike))/COUNT(*) as pref
FROM rates
WHERE username='$escaped_username'
GROUP BY type, genre, year
UNION
SELECT type, genre, '%', (SUM(like)-SUM(dislike))/COUNT(*) as pref
FROM rates
WHERE username='$escaped_username'
GROUP BY type, genre
) ilv
ORDER BY ilv.pref DESC;

因为有3个不同的字段 - 这是6个子查询,你需要为类型/流派/年的任何组合编写。

请注意,上述任何一项都不会给出与......相同的结果。

SELECT r.type, r.genre, r.year, artist, song_id, song_name
FROM rates r,
(SELECT type as preftype FROM rates t WHERE username='$escaped_username' 
   GROUP BY type ORDER BY (SUM(like)-SUM(dislike))/COUNT(*) DESC
   LIMIT 0,1) as pref_type,
(SELECT genre as prefgenre FROM rates g WHERE username='$escaped_username' 
   GROUP BY genre ORDER BY (SUM(like)-SUM(dislike))/COUNT(*) DESC
   LIMIT 0,1) as pref_genre,
(SELECT year as prefyear FROM rates y WHERE username='$escaped_username' 
   GROUP BY year ORDER BY (SUM(like)-SUM(dislike))/COUNT(*) DESC
   LIMIT 0,1) as pref_year
WHERE r.type=preftype
AND r.genre=prefgenre
AND r.year=prefyear
AND username='$escaped_username'
ORDER BY likes DESC, dislikes ASC