mysql中的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

我花了很长时间才找到使用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    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语句放在错误的位置(在联合之后)。把它放在第一个子查询中就是全部。桂冠属于你。谢谢。这和于林的回答都是我在尝试修复时玩弄的东西。非常感谢你的意见:我很高兴知道我做的事情并没有完全偏离正轨。不过,乔戈斯的回答是必要的。干杯