我有一个表,希望根据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_id
和user_id
。
这是第三个需要条件测试的表达式。如果session_id
为负,则需要返回session_id
的值。否则,您希望返回一个常量值,因此所有具有非负值的行将被组合在一起。
像这样的:
GROUP BY file_id
, user_id
, CASE WHEN session_id < 0 THEN session_id ELSE NULL END
注意,
CASE
表达式返回一个值。它不返回标识符或标识符列表。