Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在一个查询中连接三个表_Sql_Mysql - Fatal编程技术网

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 &ndash; $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 &ndash; $song_name</a></li>
   EOT;
   }
   echo "</ul>";
   }