我非常努力地尝试建立一个规范化的数据库,目前有三个表,如下 -
- 内容(c)
- 内容标签(ct)
- 标签(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/