我遇到了一个问题,试图为每个优先级最低的用户提取一个操作,优先级基于其他列内容并且是一个整数,
这是初始查询:
SELECT
CASE
...
END AS dummy_priority,
id,
user_id
FROM
actions
结果:
id user_id priority
1 2345 1
2 2345 3
3 2999 5
4 2999 2
5 3000 10
期望的结果:
id user_id priority
1 2345 1
4 2999 2
5 3000 10
按照我想要的方式尝试
SELECT x.id, x.user_id, MIN(x.priority)
FROM (
SELECT
CASE
...
END AS priority,
id,
user_id
FROM
actions
) x
GROUP BY x.user_id
哪个不起作用
错误代码:1055。SELECT列表的表达式#1不在GROUP BY中 子句并包含非聚合列'x.id',它不是 功能上依赖于GROUP BY子句中的列;
我发现的大多数示例都只是提取user_id和优先级,然后使用它们进行内部连接以获取行,但我不能这样做,因为(priority,user_id)不是唯一的
一个简单的可验证的例子是
CREATE TABLE `actions` (
`id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`priority` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `actions` (`id`, `user_id`, `priority`) VALUES
(1, 2345, 1),
(2, 2345, 3),
(3, 2999, 5),
(4, 2999, 2),
(5, 3000, 10);
如何提取所需的结果(请记住此表是子查询)?
答案 0 :(得分:1)
执行此操作的正确方法将涉及某种子查询。 。 。这需要重复case
定义。
这是另一种使用substring_index()
/ group_concat()
技巧的方法:
SELECT SUBSTRING_INDEX(GROUP_CONCAT(x.id ORDER BY x.priority), ',', 1) as id,
x.user_id, MIN(x.priority)
FROM (SELECT (CASE ...
END) AS priority,
id, user_id
FROM actions a
) x
GROUP BY x.user_id;
答案 1 :(得分:0)
正确的方式......
SELECT x...
, CASE...x... priority
FROM my_table x
JOIN
( SELECT user_id
, MIN(CASE...) priority
FROM my_table
GROUP
BY user_id
) y
ON y.user_id = x.user_id
AND y.priority = CASE...x...;
答案 2 :(得分:0)
这应该有用......
SELECT id , user_id, priority FROM actions act
INNER JOIN
(SELECT
user_id, MIN(priority) AS priority
FROM
actions
GROUP BY user_id) pri
ON act.user_id = pri.user_id AND act.priority = pri.prority