连接函数的SQL问题


SQL issues with join function

我使用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;
}

那么你想列出所有与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

这是你想要的吗?

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
;