2017-06-21 38 views
0

我有一個mysql查詢,它可以獲得0或300以上的行總數,它工作正常,除了我需要查詢將一些行組合在一起。mysql查詢將多個值合併爲一個

這裏的表:

+------------------------------+---------------------+------------+ 
| color      | check_date   | color_code | 
+------------------------------+---------------------+------------+ 
| red       | 2017-06-20 13:52:18 | 408  | 
| green      | 2017-06-17 19:10:25 | 524  | 
| green      | 2017-06-19 12:17:31 | 314  | 
| light-red     | 2017-06-19 10:51:05 | 227  | 
| dark-green     | 2017-06-25 10:47:50 | 82   | 
| dark-blue     | 2017-06-21 09:23:43 | 0   | 
| light-blue     | 2017-06-20 09:24:50 | 900  | 
| yellow      | 2017-06-19 11:01:46 | 833  | 
| medium-yellow    | 2017-06-07 16:07:49 | 0   | 
| medium-red     | 2017-06-16 09:46:38 | 19   | 
| dark-green     | 2017-06-21 08:47:50 | 822  | 
| dark-blue     | 2017-06-01 15:23:43 | 12   | 
| light-blue     | 2017-06-22 11:24:50 | 900  | 
| yellow      | 2017-06-21 09:23:43 | 8   | 
| medium-yellow    | 2017-06-17 14:07:49 | 11   | 
| light-blue     | 2017-06-16 09:46:38 | 19   | 
+------------------------------+---------------------+------------+ 

這裏的查詢:

SELECT color, 
max(check_date) AS check_date, 
count(*) AS total, 
sum(color_code < 1 OR color_code >= 300) AS cnt 
FROM check_colors 
GROUP BY color 
ORDER BY cnt DESC LIMIT 10; 

這將返回一個像這樣的表:

+------------------------------+---------------------+-------+------+ 
| color      | check_date   | total | cnt | 
+------------------------------+---------------------+-------+------+ 
| light-blue     | 2017-06-22 11:24:50 | 3 | 2 | 
| green      | 2017-06-19 12:17:31 | 2 | 2 | 
| dark-green     | 2017-06-25 10:47:50 | 2 | 1 | 
| medium-yellow    | 2017-06-17 14:07:49 | 2 | 1 | 
| dark-blue     | 2017-06-21 08:47:50 | 2 | 1 | 
| yellow      | 2017-06-21 09:23:43 | 2 | 1 | 
| red       | 2017-06-20 13:52:18 | 1 | 1 | 
| light-red     | 2017-06-19 10:51:05 | 1 | 0 | 
| medium-red     | 2017-06-16 09:46:38 | 1 | 0 | 
+------------------------------+---------------------+-------+------+ 

我需要的是一個MySQL查詢相結合以前綴爲前綴的淺色,深色和中等顏色。例如,不是將綠色和深綠色分別作爲單獨的行進行組合,而是將顏色列顯示爲綠色。結果將是總:4,CNT:3

我需要reults表從上面的查詢看起來像這樣:

+------------------------------+---------------------+-------+------+ 
| color      | check_date   | total | cnt | 
+------------------------------+---------------------+-------+------+ 
| blue       | 2017-06-22 11:24:50 | 5 | 3 | 
| green      | 2017-06-25 10:47:50 | 4 | 3 | 
| yellow      | 2017-06-21 09:23:43 | 4 | 2 | 
| red       | 2017-06-20 13:52:18 | 3 | 1 | 
+------------------------------+---------------------+-------+------+ 

檢查日期將最近的出光,暗,中等或無前綴的顏色。

如果我在PHP之前或之後在MySQL中這樣做會扭曲結果,所以必須在MySQL中。

也許我可以在mysql中以某種方式使用正則表達式?

謝謝:)

+0

爲什麼它會在查詢後「偏斜結果」?你的查詢看起來很好;只是首先循環不包含「 - 」的結果來構建顏色列表,然後遍歷包含「 - 」的顏色列表並更新關聯的「基本顏色」。 –

+0

另一種方法是你在你的GROUP BY子句中進行字符串處理... – CBroe

回答

1

可以使用

SUBSTRING_INDEX('light-green','-',-1) 

函數來實現這一點,通過子句中使用的功能選擇和組。

1

繼查詢修改即可工作:

SELECT SUBSTRING_INDEX(顏色, ' - ',-1)AS single_color,

MAX(check_date)AS check_date,

COUNT(*)AS總,

總和(color_code < 1 OR color_code> = 300)AS CNT

FROM check_colors

GROUP BY SUBSTRING_INDEX(顏色, ' - ',-1)

奧德R BY cnt DESC LIMIT 10;