2015-01-31 2 views
0

데이터베이스에서 장르 목록을 가져 오려고합니다. 각 노래의 데이터베이스에 장르 목록을 입력 한 다음 각 장르의 장르를 목록으로 가져 와서 가장 많이 발생하는 상위 3 개 항목으로 정렬합니다.PHP에서 데이터베이스의 상위 3 개 항목을 당깁니다

$sql = "SELECT `song_name`, `song_genres` FROM `songs` WHERE `album_id` = '$songAlbumId'"; 
$query = mysqli_query($conn, $sql); 

while ($row = mysqli_fetch_array($query)){ 

    $song_name = $row['song_name']; 
    $song_genres = explode(", ", $row['song_genres']); 

    for ($i = 0; $i < count($song_genres); $i++){ 
     $count=array_count_values($song_genres);//Counts the values in the array, returns associatve array 
     arsort($count);//Sort it from highest to lowest 
     $keys=array_keys($count);//Split the array so we can find the most occuring key 
     echo $keys[$i] . "<br>"; 

    } 
} 

:

여기
blues rock, garage rock, hard rock 

내 코드입니다 :

(기본 패션이 아닌 실제 결과) :

장르는 그런 방식으로 하나의 텍스트 필드에 넣어 얻을 이것은 나를주는 것을 끝내게된다 :

Hard Rock 
Garage Rock 
Hard Rock 
Garage Rock 
Psychedelic Rock 
Blues Rock 
Garage Rock 
Hard Rock 

앨범 ID 나 그 밖의 다른 것에는 아무런 문제가 없습니다. 그것은 특별히 쟝르가 옳은 것으로 명령받는 것과 관련이 있습니다. 당신의 장르가

while ($row = mysqli_fetch_array($query)){ 

    $song_name = $row['song_name']; 
    $song_genres = explode(", ", $row['song_genres']); 

foreach($song_name as $songname){ 
    for ($i = 0; $i < count($song_genres); $i++){ 
     $count=array_count_values($song_genres);//Counts the values in the array, returns associatve array 
     arsort($count);//Sort it from highest to lowest 
     $keys=array_keys($count);//Split the array so we can find the most occuring key 
     echo $keys[$i] . "<br>"; 

    } 
           } 
} 
+0

'GROUP BY' 문을 사용하십시오. –

+0

@u_mulder, 제가 사용했던 방식대로 작동합니까? 주석은 쉼표로 구분할 수 있지만 데이터베이스에서 나올 때는 긴 문자열입니다. 'GROUP BY'가 이것을 위해서 작동합니까? –

답변

0

나는 그것을 고치려고 노력했다. 나는 데이터베이스를 다시 만들고 노래 장르, 앨범 및 밴드 섹션의 데이터베이스에 노래 장르를 게시하여 쉽게 탈락 시켰습니다.

다음과 같은 문제에 도움이 필요한 사람은 솔루션 번호 : Merge multiple arrays into one array입니다.

다른 사람들의 의견을 고맙게 생각합니다.

0

당신은 다른 루프가 필요합니다. 쉼표로 구분 된 목록 대신 genres 테이블을 사용하고 추가로 songs_genres 테이블을 사용하여 노래를 장르에 연결할 수 있습니다. 그럼 당신은 PHP에서 추가 로직없이 데이터베이스에서 데이터를 얻을 수 있습니다.

SELECT g.name, COUNT(DISTINCT(sg.song_id)) cnt 
FROM genres g 
INNER JOIN songs_genres sg ON sg.genre_id = g.id 
GROUP BY g.name 
ORDER BY cnt DESC 
LIMIT 3 
1

이 장르를 정상화 각 songName으로에 대한 반향 있도록

+0

'songs_genres' 테이블이 노래를 여러 장르에 연결합니까? 그렇다면 웅장한, 그렇다면 왜 OP가 장르 테이블의 외장 키인 곡 테이블에 번호 매기기 시스템을 사용할 수있을 때 두 개의 추가 테이블이 있어야합니까? – Kinnectus

+0

@BigChris'songs_genres'는 노래와 장르 간의 N : M 링크를 제공합니다. – Arjan

+0

그건 내가 생각한거야. 당신이 n : m을 생각해줬으면 좋겠다. 이것은 기존의 설정보다는 노래를 여러 장르에 넣을 수있는 추가 아이디어를 OP에게 줄 수 있기 때문이다. – Kinnectus

관련 문제