php - 如何选择我的内容及其附带的所有标签?

标签 php mysql sql

我非常努力地尝试建立一个规范化的数据库,目前有三个表,如下 -

  1. 内容(c)
  2. 内容标签(ct)
  3. 标签(t)

我在这里想做的是选择一些行并返回它们以及与其关联的所有标签。目前,由于某种原因它只返回一个标签。

这是我正在使用的代码:

   SELECT *, 
          GROUP_CONCAT(t.tag) AS tags
     FROM content AS c 
LEFT JOIN category AS ca ON c.cid = ca.cid 
LEFT JOIN contenttags AS ct ON c.smid = ct.smid 
LEFT JOIN tags AS t ON ct.tid = t.tid 
LEFT JOIN users AS u ON c.uid = u.uid
    WHERE (t.tag IN ('tag1', 'tag2', 'tag3'))
 GROUP BY c.smid

它返回类似这样的内容:

  • cid
  • 内容
  • 网址
  • 标签(但只有一个而不是多个)

最佳答案

这是你的问题。

WHERE (t.tag IN ('$tagArray'))

考虑以下两个表达式执行不同的操作:

WHERE (t.tag IN (1,2,3,4))
WHERE (t.tag IN ('1,2,3,4'))

带引号的字符串尽管看起来是多个整数的列表,但实际上是单个值。在整数上下文中,MySQL 读取前导数字(在本例中为“1”),并在发现非数字后忽略后面的任何内容。

<小时/>

我的意思是,查询两边的引号令人困惑。 $tagArray 的值实际上是 tag1','tag2','tag3 吗?或者是'tag1','tag2','tag3'

一般来说,通过查看 SQL 来排除 SQL 故障,而不是通过查看生成 SQL 的 PHP 代码。并且请在您的问题中显示最终的 SQL 查询,不要让我们猜测 $tagArray 的值是什么。

<小时/>

PS:这可能与您的问题无关,但您在需要 INNER JOIN 的地方使用 LEFT JOIN。

关于php - 如何选择我的内容及其附带的所有标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6565260/

相关文章:

php - MySQL根据时间戳周期选择未使用/过时的ID

php - 使用 if(isset($_POST ['submit' ])) 在脚本打开时不显示回显不起作用

sql - 如何使用 GO-MSSQLDB 驱动程序获取最后插入的 ID?

sql - PL/SQL 如果表不存在创建

php - 为什么我的 html/php/ajax 返回查询中的所有行

sql - 如何区分表中使用相同查找表的两列?

php - 使用php在另一个目录中创建文件

php - 具有 X num 个关系属性的动态过滤器查询 - Doctrine Symfony2

mysql - 表格格式问题

mysql - 比较 MySQL 中的两个 ISO 日期时间字符串