在一个查询中连接三个表

时间:2009-08-16 08:32:53

标签: sql mysql

我有以下表格

混合

mid | date       | info
1   | 2009-07-01 | no info yet

音乐审查

mid | song              | buy
1   | Example - Example | http://example.com
2   | Exam - Exam       | http://example.com

曲目列表

tid | mid | mrid
1   | 1   | 1
2   | 1   | 2

是否可以使用SQL查询将这些全部链接到一个?

所以我的结果会像:

date       | info        | tracklist
2009-07-01 | no info yet | Example - Example http://example.com, Exam - Exam http://example.com

或者这个结果会被返回...或者这需要是两个sql查询,我从混音中获取MID,然后进行查询以从中获取音轨列表?

3 个答案:

答案 0 :(得分:2)

对于MySQL:

SELECT mixes.date, mixes.info, 
    GROUP_CONCAT(DISTINCT music-review.song + ' ' + music-review.buy
        ORDER BY music-review.mid ASC SEPARATOR ', ')
FROM mixes
JOIN tracklist ON tracklist.mid = mixes.mid
JOIN music-review ON music-review.mrid = tracklist.mrid
GROUP BY mixes.date, mixes.info

答案 1 :(得分:0)

这可以改编自mherren:

SELECT mixes.`date`, mixes.info,
CONCAT(GROUP_CONCAT(DISTINCT `music-review`.song , ' ' , `music-review`.`mid`
ORDER BY `tracklist`.`tid` ASC SEPARATOR ', ')) as `tracklist`
FROM mixes
JOIN tracklist ON tracklist.`mid` = mixes.`mid`
JOIN `music-review` ON tracklist.`mrid` = `music-review`.`mid`
WHERE `mixes`.`date`='2009-07-01'
GROUP BY mixes.`date`, mixes.info;

它解决了我遇到的一个模糊问题,但有一件事是group_concat的最大限制设置为1024,可以通过

更改
SET GLOBAL group_concat_max_len=4096

答案 2 :(得分:0)

我留下了很多评论,我认为建议修改您的架构作为答案会更有帮助。但是,我认为mherren已经完全解决了你的实际问题,所以虽然赞赏投票,但我认为这不应被视为正确的“答案”。

我认为您需要重新考虑如何安排数据。具体来说,你有一个似乎不合适的“音乐评论”表,同时你提到“混音”和“跟踪列表”似乎有点多余。我想你想要一对多的关系,其中“mixes”指的是关于混音的信息,比如它的创建时间,创建它的用户等等。而“tracklist”是“混音”中的歌曲列表”。如果你试过这个怎么办:

#song-info
song_id | artist        | title            | online-store
1       | The Airheads  | Asthma Attack!   | example.com/?id=123
2       | The Boners    | Bite the Boner   | example.com/?id=456
3       | Cats in Heat  | Catching a Cold  | example.com/?id=789
4       | Dirty Djangos | Dig these Digits | example.com/?id=147

#mixes
mix_id | date       | info
1      | 2009-07-01 | no info yet
2      | 2009-07-02 | no info yet

#mix_tracklist
mix_id | song_id
1      | 1
1      | 2
2      | 2
2      | 3

现在,您可以拥有可用混音的列表,如果用户选择混音,则可以查看实际歌曲的另一个查询。

只有在结果需要立即获取信息或者查询本身中的条件是否以该子查询的结果为条件时,才应尝试将所有歌曲数据放入一列。如果您只是想为每个混音列表输入混音列表,则最好根据混音索引对每个混音进行查询。所以在php输出HTML的情况下,你会选择:

$mixes = mysql_query("SELECT * FROM mixes WHERE date > '$last_week'");

 while($mix = mysql_fetch_assoc($mixes)) {
    $mix_id = $mix['mix_id'];
    $mix_date = date('m/d/Y', strtotime($mix['mix_id']));
    $mix_info = $mix['mix_id'];
    echo <<<EOT
    <h2 class="mix_number">$mix_number</h2>
    <p class="mix_date">$mix_date</p>
    <p class="mix_info">$mix_info</p>
    <h3>Track Listing:</h3>
           <ul class="tracklist">
    EOT;
    $tracks = mysql_query("SELECT song.artist artist, 
                                  song.title title, 
                                  song.online-store url
                                  song.song_id
                           FROM song-info song
                           JOIN mix_tracklist tracks ON (tracks.song_id = song.song_id)
                           WHERE tracks.mix_id = '$mix_id'
                           ORDER_BY song_id);
    while ($track = mysql_fetch_assoc($tracks)) {
           $artist = $track['artist'];
           $song_name = $track['title'];
           $song_url = $track['url'];
           echo <<<EOT
                 <li><a href="$song_url">$artist &ndash; $song_name</a></li>
   EOT;
   }
   echo "</ul>";
   }