php - 连接函数的 SQL 问题

标签 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;

}

最佳答案

您想列出与 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/

相关文章:

PHP正则表达式字符串中最多允许1个 '.'或 '_'字符,并且 '.'或 '_'不能位于字符串的开头或结尾

mysql - 正确的数据库操作以获得所需的数据

linux - 使用 Centos Linux、8GB PAE 和 MySQL 5.0.77 时严重的 mysqldump 性能下降

php - Laravel:我们可以在以前的版本中使用最新版本的服务吗

javascript - 一次输入两种形式

javascript - 读取 PHP 或 AJAX 中的击键

带有 WHERE IN 子句的 MySQL 限制

mysql - SQL查询,同时使用IN和LIKE。可能的?

mysql - 你如何使用 JOIN 而没有 ID 进行删除?

mysql选择问题,多表