2017-01-23 7 views
-1

У меня возникла проблема с попыткой вытащить одно действие для каждого пользователя с наименьшим приоритетом, приоритет основан на содержимом других столбцов и является целым числом,получить идентификатор строки с наименьшим значением, группу другим столбцом

Это первоначальный запрос:

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. Expression # 1 из списка SELECT, не в GROUP BY пункта и содержит неагрегированный столбец «x.id», который не является , функционально зависимым от столбцов в предложении GROUP BY;

Большинство примеров этого я нашел доставали только user_id и приоритет, а затем делает внутреннее соединение с обоими из них, чтобы получить строку, но я не могу этого сделать, так как (приоритет, 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

Как пытаться продать палку без леденца – Strawberry

+0

Что вы имеете в виду? это недостаток информации? – Tarik

+0

Да. См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

ответ

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