mysql中的GROUP BY条件为空列
我花了很长时间才找到使用GROUP BY消除这些结果中冗余行的正确方法:mysql中的GROUP BY条件为空列,mysql,group-by,conditional,Mysql,Group By,Conditional,我花了很长时间才找到使用GROUP BY消除这些结果中冗余行的正确方法: id title author city year pageId page 1 The Faraway Tree Blyton New York 1951 NULL 1 1 The Faraway Tree Blyton New York 1951 NULL 2 1 The Faraway Tree
id title author city year pageId page
1 The Faraway Tree Blyton New York 1951 NULL 1
1 The Faraway Tree Blyton New York 1951 NULL 2
1 The Faraway Tree Blyton New York 1951 NULL 3
1 The Faraway Tree Blyton New York 1951 NULL 4
1 The Faraway Tree Blyton New York 1951 NULL 5
1 The Faraway Tree Blyton New York 1951 NULL 7
1 The Faraway Tree Blyton New York 1951 NULL 9
1 The Faraway Tree Blyton New York 1951 NULL 13
1 The Faraway Tree Blyton New York 1951 NULL 30
2 Winnie the Pooh Milne London 1937 NULL 76
2 Winnie the Pooh Milne London 1937 NULL 73
2 Winnie the Pooh Milne London 1937 NULL 74
2 Winnie the Pooh Milne London 1937 NULL 75
1 The Faraway Tree Blyton New York 1951 4 32
2 Winnie the Pooh Milne London 1937 6 74
我只想简单地消除重复项,但前提是pageId为NULL
id title author city year pageId page
1 The Faraway Tree Blyton New York 1951 NULL 1
2 Winnie the Pooh Milne London 1937 NULL 76
1 The Faraway Tree Blyton New York 1951 4 32
2 Winnie the Pooh Milne London 1937 6 74
简单地说,逻辑是,如果pageId为NULL,则按标题分组,否则保持单行分开
听起来很简单,但无论我使用什么聚合函数或groupby
修饰符,我要么得到语法错误,要么得到不正确的结果(通常是带有pageId
的行使用空pageId进行分组)
请注意,当pageId返回为NULL时,“page”列对我来说就不重要了
下面是我正在使用的SQL查询(MySQL v.5.6.37):
SELECT id,title,author,city,`year`,NULL as pageId,pageNum as page
FROM titles
WHERE id IN ([complex subquery])
UNION ALL (
SELECT id,title,author,city,`year`,pageId,pageNum
FROM titles
WHERE titles.t_id IN ([complex subquery])
)
我在这方面已经研究了三天,在SO或网络上都找不到准确的解决方案。我想是时候谦虚地请求你的帮助了。请。类似的方法应该可以:
SELECT id, title, author, city, `year`, NULL AS pageId, MIN(page) as page
FROM title
WHERE pageId IS NULL
GROUP BY id, title, author, city, `year`
UNION ALL
SELECT id, title, author, city, `year`, pageId, page
FROM title
WHERE pageId IS NOT NULL;
将
null
pageId转换为0,然后按其分组,这有点棘手:
select
case when pageId is null then 0 else pageId end,
id,title,author,city,`year`, page
from titles
group by 1, id,title,author,city,`year`, page
如果使用IFNULL(pageId,0),然后在groupby中使用这个伪列,会怎么样?
比如:选择id、title、author、city、year、IFNULL(pageId,0)作为pageId、pageNum作为page
从标题
其中id位于([复杂子查询])
按标题、页面ID分组代码>
您可以在IFNULL
中输入任何值而不是0-“无”也可以。hi,在第一个查询中,您可以使用group by title,如@paraluiementioned@backbone我认为这是一种坏习惯。在最新版本的MySQL中,这在默认情况下是禁用的。@backbone作为经验法则:必须将SELECT
子句的每个非聚合字段添加到groupby
子句中。在我们的例子中,这些字段是id、title、author、city、year
。感谢您的评论:)。但无论如何,在描述他想要的结果时,他只想按标题分组。所以,如果两行标题相同,pageId为null,但城市不一样,那么他只希望结果中有一行,而不是2行。那么,你那长长的“一组一组”怎么解决呢?加油,乔治!对于我所做的解释:我试图将GROUP BY语句放在错误的位置(在联合之后)。把它放在第一个子查询中就是全部。桂冠属于你。谢谢。这和于林的回答都是我在尝试修复时玩弄的东西。非常感谢你的意见:我很高兴知道我做的事情并没有完全偏离正轨。不过,乔戈斯的回答是必要的。干杯