相关疑难解决方法(0)

来自GROUP_BY的两个LEFT JOIN的GROUP_CONCAT的奇怪重复行为

是我所有表格的结构和查询(请关注最后一个查询,如下所示).正如你在小提琴中看到的,这是当前的输出:

+---------+-----------+-------+------------+--------------+
| 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)

mysql sql group-by left-join group-concat

8
推荐指数
1
解决办法
569
查看次数

PostgreSQL - GROUP BY子句

我想按标签搜索,然后列出所有带有该标签的文章,以及它们匹配的给定标签的数量.例如,我可能有:

 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

如何将这些列添加到此查询?

sql postgresql group-by aggregate-functions

4
推荐指数
2
解决办法
2万
查看次数

聚合查询中的单个列并包含许多列

当查询中有许多其他列时,是否有适当的方法聚合单个列?

我已经试过了这个有效的答案,但是我的查询变得更加冗长。

我当前的查询如下所示:

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位

sql postgresql aggregate-functions

3
推荐指数
1
解决办法
3173
查看次数