2017-01-03 139 views
2

這裏是我的MySQL查詢,其結果是,我想獲得「功能」的「優先」的第一個結果的每一個值,從而得到以下GROUP BY函數返回的第一個結果

然而結果,「SELECT函數,FIRST(優先級)... GROUP BY函數」類型的語法不存在,你有什麼想法該怎麼做?

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 

感謝, 巴斯蒂安

+0

怎麼樣'MIN(ABS(優先級))'? – shmosel

+1

-200在第二個結果列表中仍然出現兩次。這是打算嗎?爲什麼100不在該列表中?另外:如果您沒有提供唯一的排序順序,則術語「第一」不明確。如果優先級相同,你將如何決定哪一個是第一個? – trincot

+0

我已經嘗試了「MIN(ABS(優先級))」,它的工作原理,但我沒有我的優先權的標誌 –

回答

2

首先,我將簡化當前的查詢:

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

然後,如果你想要的最低優先級的絕對值,那麼你就可以使用聚合和一個substring_index()/group_concat()絕招:

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; 

case表達:

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

警告:我使用了challenge_acces_rule表和另外一個challenge_acces_user,我使用這兩個表來獲得優先級,「朋友」之後的'AND 1'將被更改 –

0

此代碼的工作!

由於戈登

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 
相關問題