2017-05-28 48 views
0

通過值分塊我有它返回這樣數據的簡單原始的SQL查詢:分組和在MySQL

SELECT 
    a.id, count(ah.id) as count 
FROM 
    `table_name_one` as a 
JOIN 
    `table_name_two` as ah 
ON 
    a.id=ah.answer_id 
WHERE 
    a.user_id = 7178 
    AND a.created_at BETWEEN '2017-05-01' AND '2017-05-28' 
GROUP BY a.id 

enter image description here

我想這組由結果兩組。 當revisionCount == 1時組1將包含數據,組2將包含數據的其餘部分。我可以通過使用循環來做到這一點,但如果我可以通過SQL查詢來做到這一點,那對我來說會很好。

有人能幫我從這裏出來嗎?

+0

這裏是鏈接,它可以幫助你。 https://stackoverflow.com/questions/8610907/group-by-except-for-certain-value – DevelopmentIsMyPassion

+0

只更改** GROUP BY a.id **到GROUP BY(revisionCount = 1)desc,a.id ** –

回答

1

如果你想構建兩組值的列表,你可以在一個查詢中這樣做:

SELECT GROUP_CONCAT(CASE WHEN cnt = 1 THEN id END) as id_1s, 
     GROUP_CONCAT(CASE WHEN cnt > 1 THEN id END) as id_2plus 
FROM (SELECT a.id, count(ah.id) as cnt 
     FROM `table_name_one` a JOIN 
      `table_name_two` as ah 
      ON a.id = ah.answer_id 
     WHERE a.user_id = 7178 AND 
      a.created_at BETWEEN '2017-05-01' AND '2017-05-28' 
     GROUP BY a.id 
    ) a; 

這會將值轉換成以逗號分隔的列表。 MySQL默認限制長度爲1,024個字符。如果列表更長,則可以運行查詢兩次以生成每個列表。 。 。或者只需訂購cnt並在讀取返回值時檢查該值。

+0

是的,這個返回逗號分隔的列表。但我需要數據這樣格式 數組:2 [▼ 0 => { 0 => { + 「ID」:171437 + 「revisionCount」:1 }, 1 => { + 「ID」 :171437 + 「revisionCount」:1 } 1 => {#671▼ + 「ID」:172759 + 「revisionCount」:2 } ..... ] 由於 – Minhajul

0

您可以使用having子句來實現此目的。我建議您在線閱讀having的更多信息。

下面的查詢會給你計數的所有記錄完全按照1:

SELECT 
    a.id, count(ah.id) as count 
FROM 
    `table_name_one` as a 
JOIN 
    `table_name_two` as ah 
ON 
    a.id=ah.answer_id 
WHERE 
    a.user_id = 7178 
    AND a.created_at BETWEEN '2017-05-01' AND '2017-05-28' 
GROUP BY a.id 
HAVING count(ah.id) = 1 

你可以調整在上面的查詢中具有條件,以獲得第二組。

+0

這將返回count == 1的數據。但是我需要兩個數組中的所有數據。 – Minhajul

+0

要使其在同一個查詢中,可以使用'CASE WHEN'子句來實現它。 –

+0

@Minhajul你試過鏈接我給了嗎? – DevelopmentIsMyPassion

0

我假設你需要2個結果集作爲數組在php中,爲此您需要編寫2個以分號分隔的查詢。

Query 1 where revision count =1; 
Query 2 where revision count >1; 

希望這有助於