连接函数的SQL问题

时间:2016-10-30 10:26:27

标签: php mysql sql join

我使用MySQL / PHP来存储我的数据。

我有一个包含帖子的网站,我希望能够通过标签订购。 (帖子有多个标签)

有3张桌子。

媒体(帖子)

+----+--------+-----+
| id | title  | ... |
+----+--------+-----+
|  1 | hello  | ... |
|  2 | hi     | ... |
+----+--------+-----+

代码

+----+------+-----+
| id | name | ... |
+----+------+-----+
|  1 | red  | ... |
|  2 |square| ... |
+----+------+-----+

medias_tags (为了将媒体和标签链接在一起)

+----+----------+--------+
| id | media_id | tag_id |
+----+----------+--------+
|  1 |        1 |      1 |
|  2 |        1 |      2 |
|  3 |        2 |      2 |
+----+----------+--------+

所以我使用这个SQL查询将表连接在一起并输出带有特定标记的帖子。

$req_mda_list = $bdd->query('SELECT * FROM medias 
JOIN medias_tags 
ON medias.id=medias_tags.media_id 
WHERE medias_tags.tag_id ='.$tag_id.' 
ORDER BY date DESC 
LIMIT '.$start.','.$limit);

当我在其中进行其他SQL查询以获取每个帖子的其他标签(帖子有多个标签)时, 它不起作用。我试图扭曲查询,但我从查询或随机标签中得不到任何数据。

$data_mda = $req_mda_list->fetch()){

 $req_mda_tags = $bdd->prepare('SELECT * FROM medias_tags WHERE media_id = ?');
 $req_mda_tags->execute(array($mda_id));      

 $mda_tags_list = null;

 while ($data_mda_tags = $req_mda_tags->fetch()){
    $tag_id = $data_mda_tags['tag_id'];

    $req_tag_name = $bdd->prepare('SELECT * FROM tags WHERE id = ?');
    $req_tag_name->execute(array($tag_id));
    $data_tag_name = $req_tag_name->fetch();

    $mda_tags_list .= $data_tag_name['name'].' ';
 }

 #Show media title

 echo $mda_tags_list;

}

2 个答案:

答案 0 :(得分:0)

所以你想列出与medias相关联的所有标签的名称?

MySQL有一个名为GROUP_CONCAT的内置函数。您可以使用它来在一个查询中获取所有标记名称。

SELECT m.media_id, GROUP_CONCAT(t.name SEPARATOR ' ') AS tag_names
FROM media_tags m
INNER JOIN tags t ON m.tag_id = t.id
GROUP BY m.media_id

如果您只想按media_id获取代码列表,则只需添加WHERE条款即可。

SELECT m.media_id, GROUP_CONCAT(t.name SEPARATOR ' ') AS tag_names
FROM media_tags m
INNER JOIN tags t ON m.tag_id = t.id
WHERE m.media_id = ?
GROUP BY m.media_id

答案 1 :(得分:0)

这就是你要找的东西吗?

select      m.title
           ,t.name

from                    medias_tags mt

            join        media       m

            on          m.media_id  = mt.media_id

            join        tags        t

            on          t.tag_id    = mt.tag_id

order by    m.title
           ,t.name
;

还是这个? -

select      m.title
           ,group_concat(t.name order by t.name)    as tags

from                    medias_tags mt

            join        media       m

            on          m.media_id  = mt.media_id

            join        tags        t

            on          t.tag_id    = mt.tag_id

group by    m.title

order by    m.title
;