我有一个表,希望根据session id的值对行进行分组。如果会话小于零,则按用户id、文件id和会话id分组如果不小于零,则按用户id、文件id分组
我提出的问题

select user_id, file_id, session_id
from memo
group by file_id, user_id, case
    when session_id < 0 then 'session_id'
end


select user_id, file_id, session_id
from memo
group by case
    when session_id < 0 then 'file_id, user_id, session_id'
    else 'file_id, user_id'
end

两个查询的结果都是
user_id     file_id     session_id
8710        1896366041  -1452797155
8710        1896366041  1452797185914

我想要的是会话id只有一个正值,而每个值都是唯一的负值。我现在的解决方法是使用两个查询,每个查询使用不同的where语句来处理会话id的负值和正值
一些样本数据
CREATE TABLE IF NOT EXISTS `memo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`file_id` int(11) NOT NULL,
`page_id` int(11) NOT NULL,
`content` text NOT NULL,
`last_update` int(11) NOT NULL,
`session_id` bigint(20) NOT NULL DEFAULT '0',
`object_id` varchar(30) DEFAULT NULL,
`evaluated_id` int(11) DEFAULT '0',
PRIMARY KEY (`id`)
)
INSERT INTO `memo` (`id`, `user_id`, `file_id`, `page_id`, `last_update`, `session_id`, `object_id`, `evaluated_id`) VALUES
    (1585, 8710, 1896366041, 0, 1452797202, -1452797155, '1452797152590_63', 0),
    (1586, 8710, 1896366041, 0, 1452797202, -1452797155, '1452797153301_61', 0),
    (1588, 8710, 1896366041, 0, 1452797202, -1452797172, '1452797169976_46', 0),
    (1589, 8710, 1896366041, 0, 1452797202, -1452797172, '1452797170590_24', 0),
    (1591, 8710, 1896366041, 0, 1452797202, 1452797185914, '1452797186652_24', 0),
    (1592, 8710, 1896366041, 0, 1452797202, 1452797185914, '1452797187329_8', 0),
    (1594, 8710, 1896366041, 0, 1452797202, 1452797200154, '1452797201237_32', 0),
    (1595, 8710, 1896366041, 0, 1452797202, 1452797200154, '1452797201682_11', 0),
    (1596, 8710, 1896366041, 0, 1452797202, 1452797200154, '1452797201931_93', 0);

如果有人能帮我的话就好了,谢谢

最佳答案

正如其他答案所指出的,还有其他的查询模式可能会得到您想要的结果。但我看到了您所处的轨迹,并且可以使用CASE中的GROUP BY表达式来实现指定的结果。
看起来您真正想要的是在GROUP BY子句中指定三个表达式。(GROUP BY中的表达式在执行过程中不能有条件地修改。这是一个表达式的静态列表。)
前两个表达式只是列名file_iduser_id
这是第三个需要条件测试的表达式。如果session_id为负,则需要返回session_id的值。否则,您希望返回一个常量值,因此所有具有非负值的行将被组合在一起。
像这样的:

 GROUP BY file_id
        , user_id
        , CASE WHEN session_id < 0 THEN session_id ELSE NULL END

注意,CASE表达式返回一个值。它不返回标识符或标识符列表。

09-28 09:26
查看更多