1

我有一个表格帖子作为 p,表格标签作为 pt,表格标签引用作为 ptr。

tagsref 将具有 post 和 tags 表的 id。

我使用了 group_concat 并且我没有使用 group by 子句,因为在条件中我使用 if 条件仅过滤一行(p.slug = 'once'),假设因为我添加了条件,所以只会返回一行。是的,它确实。

问题是当仍然没有行时,我得到了一行具有空值的行。在下面的 sql 中,最后一个条件不会获取任何结果,因为没有 slug 为 'none' 的行,所以我根本不应该得到任何结果,但我得到了一行具有空值的行。

SELECT p.name, p.slug, GROUP_CONCAT(pt.name) as catz 
FROM post_tags pt, post_tagsref ptr, post p  
WHERE p.id = ptr.tid AND ptr.cid = pt.id  AND p.slug = 'none'

人们建议使用 group by 子句,并提到 group_by 聚合函数即使未指定 group by 子句也可以工作,但结果可能无法预测。

我使用 group by 并且正在工作。然而。

post
-----
id  |   name    |   slug
1   |   sam     |   sam
2   |   do do   |   do-do

post_tags
--------------
id  |   name    |   slug
1   |   music   |   music
2   |   movies  |   movies
3   |   tv      |   tv

post_tagsref
------------    
pid |   pcid
1   |   2
1   |   1
2   |   1

以上是表结构。

如果根本没有行,那么为什么 group_concat 返回一行具有空值?

提出这样一个问题的原因是要确定什么是什么...... :)

参考:

当找不到 id 时,查询导致 1 行具有空值

4

1 回答 1

0

尽管如此,没有输入的聚合函数往往会产生输出:没有行的总和为零,计数也为零,平均值为NULL. 这种事情使很多查询保持一致,应该是你得到NULL.

我没有使用 group by 子句,因为在条件中我使用 if 条件仅过滤一行 [...]

您只过滤到一个帖子,但我假设每个帖子可能有多个标签(否则您为什么要使用group_concat),因此连接将导致多行。因此,您可能希望按帖子 ID 进行分组。

另请注意,由于您目前正在进行内部联接,因此不会报告根本没有标签的帖子,因此请考虑在那里使用左联接。

于 2012-12-07T13:24:12.420 回答