这是我所有表格的结构和查询(请关注最后一个查询,如下所示).正如你在小提琴中看到的,这是当前的输出:
+---------+-----------+-------+------------+--------------+
| user_id | user_name | score | reputation | top_two_tags |
+---------+-----------+-------+------------+--------------+
| 1 | Jack | 0 | 18 | css,mysql |
| 4 | James | 1 | 5 | html |
| 2 | Peter | 0 | 0 | null |
| 3 | Ali | 0 | 0 | null |
+---------+-----------+-------+------------+--------------+
Run Code Online (Sandbox Code Playgroud)
这是正确的,一切都很好.
现在我还有一个名为"category"的存在.每个帖子只能有一个类别.而且我还希望为每个用户获得前两个类别.而这里是我的新的查询.正如您在结果中看到的,发生了一些重复:
+---------+-----------+-------+------------+--------------+------------------------+
| user_id | user_name | score | reputation | top_two_tags …Run Code Online (Sandbox Code Playgroud) 我想按标签搜索,然后列出所有带有该标签的文章,以及它们匹配的给定标签的数量.例如,我可能有:
Page1 - 2 (has css and php tag)
Page2 - 1 (has only css tag)
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT COUNT(t.tag)
FROM a_tags t
JOIN w_articles2tag a2t ON a2t.tag = t.id
JOIN w_article a ON a.id = a2t.article
WHERE t.tag = 'css' OR t.tag = 'php'
GROUP BY t.tag
LIMIT 9
Run Code Online (Sandbox Code Playgroud)
当我只把COUNT(t.tag)查询工作,我得到了好结果.但如果我追加ID我的文章,我会得到以下错误:
错误:列"a.title"必须出现在GROUP BY子句中或用于聚合函数LINE 1:SELECT COUNT(t.tag),a.title FROM a_tags t
如何将这些列添加到此查询?
当查询中有许多其他列时,是否有适当的方法聚合单个列?
我已经试过了这个有效的答案,但是我的查询变得更加冗长。
我当前的查询如下所示:
SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ')
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid
LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid
GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6
ORDER BY t2.foo5, t2.foo6
Run Code Online (Sandbox Code Playgroud)
该查询具有更多字段和LEFT JOINs,重要的部分是所有这些字段都具有1到1或1到0的关系,除了上面要t3.aggregated_field在上面的伪查询中表示的要聚合的1到n的一个字段。
当我使用汇总函数时,SELECT和中列出的所有字段都ORDER BY必须汇总或成为GROUP BY子句的一部分。这使我的查询方式比现在更加冗长。
也就是说,假设foo1是主键,则在重复此字段时,除其他字段外的所有其他字段aggregated_field也相等。我希望将这些重复的行作为具有聚合字段值的单行结果。(基本上是a select distinct,带有汇总列)
是否有更好的方法来执行此操作(而不必将所有其他字段都放入GROUP BY),还是应该仅对后端执行的结果集进行迭代,以对获取此1到n关系的每一行执行查询?
服务器正在运行PostgreSQL 9.1.9,更具体地说:
x86_64-unknown-linux-gnu上的PostgreSQL 9.1.9,由gcc(GCC)4.1.2 20080704(Red Hat 4.1.2-54)编译,64位