获取具有最小值的行的id,按其他列

时间:2017-01-23 12:33:30

标签: mysql sql

我遇到了一个问题,试图为每个优先级最低的用户提取一个操作,优先级基于其他列内容并且是一个整数,

这是初始查询:

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);

如何提取所需的结果(请记住此表是子查询)?

3 个答案:

答案 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