2012-07-01 2 views
2

내가 3 개의 MySQL 테이블을 가지고 있다고 가정 해 봅시다. 노래의 아티스트, 앨범 등을 가지고있는 songs이라는 노래 데이터베이스가 있습니다. 가장 중요한 것은 노래의 UNIQUE ID 인 lastfm_id입니다.MySQL - 행당 ​​평균을 얻는 방법

다음은 list입니다 (상위 10 곡과 같은 10 개의 반점이 있음). 사람들은 자신의 목록에 노래를 추가하여 목록을 만들고 1 ~ 10의 순위를 매길 수 있습니다.이 데이터베이스는 실제로이 데이터베이스에 액세스 할 필요가 없습니다.

마지막으로 우리는 사람들이 목록에 올리기 위해 선택한 노래 인 song_listed을 가지고 있습니다. 여기에 TI는 다음과 같습니다

enter image description here

는 당신이 볼 수 있듯이, song_listedsong_id 테이블 songs에서 lastfm_id과 동일합니다. 이제는 데이터베이스에 하나의 목록 만 있으므로 10 곡이 있습니다. 목록이 세 개 생성 된 경우 song_listed에 30 개의 행이 있으며 각 행의 순위는 1-10입니다.

목록에있는 각 노래의 song_listed의 평균 순위는 어떻게 받습니까?

list.php?id=11912 또는 그와 비슷한 것을 통해 목록을 보여주는 페이지가 있다고 상상해보십시오. 그런 다음 song_listed에서 list_id11912 인 노래를 가져옵니다. 여기

는 내가 지금까지 가지고있는 작업은 다음과 같습니다

$listSongs = 0; 
while ($listSongs <= 9) { 

    // Don't worry, I did a query and $songID[x] works. 
    $songID = $songID[$listSongs]; // ex: 12949331 
    $getAvgRank = mysql_query("") or die(mysql_error()); 

    } 
+0

일반적인 mysql_ 코멘트를 던질 사람이 있습니까? –

+0

노래 A가 1 위의 2 목록에있는 경우 2 순위 때마다 200 목록에있는 노래 B보다 좋을까요? – Aprillion

+1

날짜가 기입 된 mysql_ * 함수를 사용하지 마십시오. 새 코드에 사용하면 [권장] (http://php.net/mysql_query)입니다. 더 많은 현대적인 대안을 사용할 수 있으며 더 잘 유지 관리됩니다. [prepared statements] (http://en.wikipedia.org/wiki/Prepared_statement) 에 대해 학습하고 [PDO or MySQLi] (http://php.net/manual/en/mysqlinfo) 중 하나를 사용하십시오. api.choosing.php). 엄격하게 사용하면 지루하고 수동으로 빠져 나오는 부분을 피할 수 있으므로 은 힙이 쉬워지고 부산물로 사용하는 것이 안전합니다. 시작하려면 [PDO 튜토리얼] (http://goo.gl/vFWnC)을 참조하십시오. – Ben

답변

2
SELECT song_id, AVG(rank) 
FROM song_listed 
WHERE song_id in 
    (SELECT s1.song_id FROM song_listed s1 WHERE s1.list_id = <the id of your list_id>) 
GROUP BY song_id 

편집

당신이 song_id에 의해 하나 개의 요청하려는 경우 (좋은 생각이 아니라)

SELECT AVG(rank) 
FROM song_listed 
WHERE song_id = $songID[$realArray] 

주의 : 이것은 단지 "논리적"솔루션 일뿐입니다. 매개 변수화 된 쿼리를 사용하십시오 (그리고 mysql_ * 함수에 Ben의 주석을 읽으십시오).

+0

'SQL 구문에 오류가 있습니다. 올바른 구문을 찾으려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오 '근처에'?) group by song_id 'on line 1' Hmmm – nn2

+1

글쎄, 매개 변수로'?'를 변경할 수 있다고 생각하십시오 (예 : 'gjX ....')? –

+0

Riiight. 나는이'$ getAvgRank = mysql_query ("song_id, $ AVG (rank) from song_list where song_id를 선택했다. (s1.list_id = $ songID [$ realArray]) song_id에 의해 song_listed s1에서 s1.song_id를 선택한다. mysql_error());'그리고''로 출력하면'resource id # 13' 또는 이와 비슷한 것을 얻을 수 있습니다. – nn2

1

나는 평균 순위가 당신에게 올바른 정보를 제공합니다 - 목록에서 2 곡을 상상해보십시오 - 노래 A는 총 2 개의 목록으로 구성되어 있으며, 매번 순위 1로, 노래 B는 200 개의 목록으로 매번 순위와 함께 표시됩니다 2 => 노래 A는 훨씬 더 대중적이라 할지라도 평균 순위 1과 노래 B 2를 갖습니다.

대신 "인기도"측정 항목을 사용하는 것이 좋습니다 (예 : 순위 1의 경우 10 포인트 ... 순위의 경우 1 포인트). 10) :

select s.song_id, sum(11 - s.rank) popularity_points 
from song_listed s 
join song_listed l on s.song_id = l.song_id and l.list_id = :my_list_id 
group by s.song_id 
관련 문제