Sql 在一个查询中连接三个表
我有下列表格 混合 音乐评论Sql 在一个查询中连接三个表,sql,mysql,Sql,Mysql,我有下列表格 混合 音乐评论 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
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,然后执行查询以从中获取跟踪列表吗?对于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
这项工作改编自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
我留下了太多的评论,我认为建议修改您的体系结构作为答案会更有帮助。然而,我确实认为姆赫伦已经恰当地解决了您的实际担忧,因此,尽管投票是值得赞赏的,但我不认为这是正确的“答案” 我认为你需要重新考虑你是如何安排数据的。具体来说,你有一张“音乐评论”的表格,这似乎不合适,同时你提到的“混音”和“曲目列表”似乎有点多余。我想你想要一对多的关系,其中“混合”指的是关于混合的信息,比如它创建的时间、创建它的用户等等,而“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>";
}
$mixes=mysql\u查询(“从日期>'$last\u week'的混合中选择*);
而($mix=mysql\u fetch\u assoc($mix)){
$mix_id=$mix['mix_id'];
$mix_date=date('m/d/Y',strottime($mix['mix_id'));
$mix_info=$mix['mix_id'];
echo我认为您的示例代码中有一个错误。音乐评论表是否应该按mrid
而不是mid
索引?或者它是否引用混音表?此外,我不确定数据的结构对我是否有意义。歌曲信息显示的唯一位置是“音乐评论”中,据我所知,里面没有任何评论数据。也许“音乐评论”应该是“歌曲信息”因为它似乎指的是关于歌曲的信息。有什么原因可以解释为什么艺术家和歌曲名称都只有一列?这可能是两列,这将使排序更加可靠。最后:如果我可以问一下,为什么你想要你一开始问到的结果?你的问题在更高的层次上是有效的还有一个是我自己必须弄清楚的。但是如果你已经有了一个到曲目列表的索引,为什么你要尝试将所有的曲目列表信息合并到结果中。为什么不只是对这三个表进行联接(正如mherren所说的那样),只需将tracklist列作为您的tracklist索引?当您想查看特定行的tracklist的详细信息时,只需查询该tracklist编号?这就是我在mherren示例中查找的内容,但我不知道如何执行此操作
$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>";
}