Найти наиболее распространенные значения данных из столбцов MySQL? - PullRequest
1 голос
/ 16 августа 2011

Я пытаюсь интегрировать приложение с предложением музыки в мое текущее приложение для оценки музыки.И я искал способ предложить музыку, основанную на текущих вкусах.

Я пишу этот вопрос на моем iPod, поэтому форматирование, вероятно, неверно, поэтому я объясню столбцы.

rate_id, username, artist, type (мужской / женский / смешанный), song_id, songname, genre, year, like, dislike

Например, одному человеку нравятся 4 трека, этот запрос:

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

возвращает:

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

Хорошо, так что из этого шаблона рейтинга,мы знаем, что mrexample больше всего нравились поп-песни женщин, написанные в 2010 году, поэтому из этих данных мы формируем запрос к нашей базе данных музыкальных коллекций, созданной пользователем:

mysql_query("SELECT * FROM music WHERE genre='pop' AND type='F' AND year='2010' LIMIT 5 ORDER BY RAND()")

Теперь мой вопрос: как мне узнать, что это за общие данные из большого количества данных о ставках этого человека?

Я думаю, что для этого должна быть команда mysql, но я не уверен: /

Я думал о том, что если заявления, невозможно, слишком много возможностей, если частью популярной части был артист, множество артистов в нашей базе данных.переключиться, снова то же самое.считать, ничего особенного, что я могу сосчитать.Я мог бы написать несколько строк против if, опять же - слишком много для обработки.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

На тривиальном уровне ....

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
0 голосов
/ 16 августа 2011

Этот запрос дает вам любимый жанр пользователя. Если вы хотите учесть другие параметры, такие как «тип», вам нужно определить формулу для этого и соответственно изменить этот запрос.

SELECT genre FROM rates
  WHERE username = '$_SESSION["username"]'
  GROUP BY genre
  ORDER BY COUNT(*) DESC
  LIMIT 1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...