我使用 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
关于php - 连接函数的 SQL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328085/