在php中从数据库中拉出前三项

时间:2015-01-31 08:30:15

标签: php mysql for-loop

我试图从数据库中提取一系列类型。我在每个歌曲的数据库中输入一个流派列表,然后它(应该)将每首歌曲的类型拉入一个列表中,并按照前三个最常见的顺序排列。

这种类型以这种方式被放入一个文本字段:

(基本时尚,不是实际结果):

blues rock, garage rock, hard rock

这是我的代码:

$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>";

    }   
}

这最终给了我:

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

另请注意,相册ID或其他内容没有任何问题。它特别适用于正确订购的流派。

3 个答案:

答案 0 :(得分:1)

规范化类型。使用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 :(得分:0)

您需要另一个循环,以便您的流派为每个歌曲名称回显

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>";

    }   
                                }
}

答案 2 :(得分:0)

我花了几天时间试图解决这个问题。我最终重新编写了数据库并将歌曲类型发布到歌曲,专辑和乐队部分的数据库中,以便轻松实现。

对于将来需要帮助解决此类问题的任何人,解决方案就在这里:Merge multiple arrays into one array

我很欣赏其他人的意见。