我有以下表格
混合
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,然后进行查询以从中获取音轨列表?
答案 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 – $song_name</a></li>
EOT;
}
echo "</ul>";
}