2017-01-03 7 views
2

Hier ist meine MySQL-Abfrage mit dem Ergebnis zurückgibt, möchte ich für jeden Wert von ‚Funktion‘ ist das erste Ergebnis der ‚Priorität‘, erhalten und somit das Ergebnis unterGROUP BY-Funktion, die das erste Ergebnis

erhalten jedoch , eine Syntax vom Typ "SELECT-Funktion, FIRST (Priorität) ... GROUP BY-Funktion" existiert nicht, haben Sie eine Idee, wie Sie dies tun?

SELECT car.function, car.priority 
FROM challenge_access_rule car 
WHERE 10 = car.challenge_id AND 
     (car.rule in ('everybody', 'friends') or 
     car.user_id = 2 
    ) 
ORDER BY ABS(car.priority); 

Dann, wenn Sie das Minimum der Absolutwert der Priorität möchten, dann können Sie:

SELECT 
    function, 
    priority 
FROM challenge_access_rule 
WHERE 10 = challenge_access_rule.challenge_id 
     AND (
     rule = 'everybody' 
     OR (rule = 'friends' AND 1) 
    ) 
UNION 
SELECT 
    function, 
    isRestriction AS priority 
FROM challenge_access_user 
WHERE 10 = challenge_access_user.challenge_id AND challenge_access_user.user_id = 2 
ORDER BY ABS(priority) 

-- RESULT -- 
emitInstance  | 0 
emitDeal   | 0 
emitDealInstance | 1 
emitDeal   | 100 
emitDealInstance | -100 
vote    | -100 
emitDeal   | -200 
view    | -200 
interact   | -200 

-- DESIRED RESULT -- 
emitInstance  | 0 
emitDeal   | 0 
emitDealInstance | 1 
vote    | -100 
view    | -200 
interact   | -200 

Danke, Bastien

+0

Wie wäre es 'MIN (ABS (Priorität))'? – shmosel

+1

-200 tritt immer noch zweimal in der zweiten Ergebnisliste auf. Ist das beabsichtigt? Warum ist 100 nicht in dieser Liste? Außerdem: Der Begriff "erster" ist mehrdeutig, wenn Sie keine eindeutige Sortierreihenfolge angeben. Wie entscheiden Sie, welches zuerst bei gleicher Priorität ist? – trincot

+0

Ich habe bereits versucht "MIN (ABS (Priorität))", es funktioniert, aber ich habe nicht das Zeichen meiner Priorität –

Antwort

2

Zuerst möchte ich Ihre aktuelle Abfrage vereinfachen Verwendung Aggregation und ein substring_index()/group_concat() Trick:

SELECT car.function, 
     substring_index(group_concat(car.priority order by ABS(car.priority)), ',', 1) as priority 
FROM challenge_access_rule car 
WHERE 10 = car.challenge_id AND 
     (car.rule in ('everybody', 'friends') or 
     car.user_id = 2 
    ) 
GROUP BY car.function; 

oder ein case Ausdruck:

SELECT car.function, 
     (case when min(car.priority) = - min(abs(car.priority)) 
      then - min(abs(car.priority)) 
      else min(car.priority) 
     end) as priority 
FROM challenge_access_rule car 
WHERE 10 = car.challenge_id AND 
     (car.rule in ('everybody', 'friends') or 
     car.user_id = 2 
    ) 
GROUP BY car.function; 
+0

Warnung: Ich benutze eine challenge_acces_rule Tabelle und einen anderen challenge_acces_user, den ich benutze, um Priorität zu bekommen, und die 'AND 1' nach 'friends' wird geändert –

0

Dieser Code Arbeit!

Dank Gordon

SELECT function, 
substring_index(group_concat(priority ORDER BY ABS(priority)), ',', 1) 
FROM (
     SELECT 
     function, 
     priority 
     FROM challenge_access_rule 
     WHERE 10 = challenge_access_rule.challenge_id 
      AND (
       rule = 'everybody' 
       OR (rule = 'friends' AND 1) -- 'AND 1' edit after 
      ) 
     UNION 
     SELECT 
     function, 
     isRestriction AS priority 
     FROM challenge_access_user 
     WHERE 10 = challenge_access_user.challenge_id AND challenge_access_user.user_id = 2 
     ORDER BY ABS(priority) 
    ) AS toto 
GROUP BY function 
Verwandte Themen