2017-07-13 82 views
0

我有表:GROUP BY部分

ID_table, User, Multi_ID, Action, Date, ... 
100  , JN , 0  , test1 , 1.1.2017 
101  , DK , 51 , test2 , 3.1.2017 
102  , JN , 51 , test2 , 3.1.2017 
103  , LP , 0  , test3 , 3.1.2017 
104  , DK , 52 , test4 , 5.1.2017 
105  , LP , 52 , test4 , 5.1.2017 
106  , KH , 52 , test4 , 5.1.2017 

我想使GROUP BY Multi_ID,但僅限於Multi_ID> 0 如果Multi_ID = 0 - 沒有GROUP BY ...:

Date  Users  Action 
1.1.2017 (JN)  test1 
3.1.2017 (DK,JN) test2 
3.1.2017 (LP)  test3 
5.1.2017 (DK,LP,KH) test4 

有我的代碼,而無需溶液Multi_ID = 0

$sql="SELECT * , GROUP_CONCAT(DISTINCT User separator ',') AS Us  
     FROM table 
    GROUP BY Multi_ID 
    ORDER BY Date ASC"; 
$result = MySQL_Query($sql); 

由於

+0

你想要的結果是什麼? – Blank

+0

在單個查詢中 - 不,這是不可能的。分組依據適用於整個結果集。你可以做的是編寫2個單獨的查詢,並使用'union'結合它們。然而,你的第二個查詢沒有任何意義,因爲它有一個單獨的聚合函數沒有一個組,因爲它會將結果集合合成一條記錄。因此'select *'部分沒有任何意義。你必須詳細描述你在這裏想要達到的目標。 – Shadow

+0

@Shadow我認爲這是可能的。可以引入一個新列,等於'Multi_ID> 0的'Multi_ID',否則引入一個新的Guid,並且在這個列上組。 – user5226582

回答

0

您需要兩個查詢,其中您UNION ALL粘合在一起的結果:

SELECT date, user AS users, action 
FROM mytable 
WHERE multi_id = 0 
UNION ALL 
SELECT 
    MAX(date) AS date, 
    GROUP_CONCAT(DISTINCT user SEPARATOR ',') AS users, 
    MAX(action) AS action 
FROM mytable 
WHERE multi_id > 0 
GROUP BY multi_id 
ORDER BY date; 

另一種選擇是由一羣在UUIDMulti_ID = 0情況下,爲了讓他們分開。這可能既優雅又不容易理解;-)

SELECT 
    MAX(date) as date, 
    GROUP_CONCAT(DISTINCT user SEPARATOR ',') AS users, 
    MAX(action) as action 
FROM mytable 
GROUP BY CASE WHEN multi_id = 0 THEN uuid() ELSE multi_id END 
ORDER BY date;