2017-01-23 5 views
-1

Ich lief ein Problem beim Versuch, eine Aktion pro Benutzer mit der geringsten Priorität zu ziehen, die Priorität basiert auf anderen Spalten Inhalt und ist eine ganze Zahl,Holen Sie sich die ID der Zeile mit dem kleinsten Wert, Gruppe von einer anderen Spalte

Dies ist die erste Abfrage:

SELECT 
    CASE 
     ... 
    END AS dummy_priority, 
    id, 
    user_id 
FROM 
    actions 

Ergebnis:

id user_id  priority 
1 2345  1 
2 2345  3 
3 2999  5 
4 2999  2 
5 3000  10 

Gewünschtes Ergebnis:

id user_id  priority 
1 2345  1 
4 2999  2 
5 3000  10 

Nach was ich versuchte ich will

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 

Was nicht

Fehlercode nicht funktioniert: 1055. Expression # 1 von SELECT-Liste ist nicht in GROUP BY-Klausel und enthält nichtaggregierte Spalte 'x.id', die nicht ist, funktional abhängig von Spalten in GROUP BY-Klausel;

Die meisten Beispiele dafür ich nur die user_id und Priorität Extrahieren gefunden wurden und dann mit ihnen beiden eine innere Verknüpfung macht die Reihe zu bekommen, aber ich kann da nicht tun (Priorität, user_id) nicht einzigartige

ein einfacher wäre nachprüfbare Beispiel

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

wie das gewünschte Ergebnis zu extrahieren (im Auge halten Sie bitte, dass diese Tabelle eine Unterabfrage ist)?

+0

Wie versucht, einen Stock ohne einen Lutscher zu verkaufen – Strawberry

+0

was meinst du? Ist es der Mangel an Informationen? – Tarik

+0

Ja. Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql-query – Strawberry

Antwort

1

Der richtige Weg, um dies zu tun, würde eine Unterabfrage von irgendeiner Art beinhalten. . . und das würde erfordern, die case Definition zu wiederholen.

Hier ist eine weitere Methode, die substring_index()/group_concat() Trick: in voller

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

Und das richtige Art und Weise ...

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

Diese Arbeit sollte ...

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 
Verwandte Themen