2017-06-21 27 views
0

私は、0または300以上の行の総数を取得するmysqlクエリを持っており、一部の行をまとめてグループ化するクエリが必要な場合を除いて正常に動作します。ここで複数の値を1つにまとめる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 | 
+------------------------------+---------------------+-------+------+ 

チェック日付が光、闇のうち最も最近のだろう、中または未修正の色です。

mysqlの前または後にPHPでこれを行うと、結果が歪んでしまうので、mysqlになければなりません。

多分mysqlでregexを使うことができますか?

感謝:)

+0

クエリの後に「結果を歪ませる」のはなぜですか?あなたのクエリは上品です。最初に " - "を含まない結果をループして、色のリストを作成し、 " - "を含むものをループし、関連する "基本色"を更新します。 –

+0

代わりに、あなたはあなたのGROUP BY句で文字列操作をするでしょう... – CBroe

答えて

2

これを行うにはSUBSTRING_INDEXを使用できます。

は一例に持って

value color 
10 light-red 
4 red 
7 red 
2 light-pink 
4 dark-pink 
6 medium-pink 
6 pink 


SELECT SUBSTRING_INDEX(color, '-', -1) AS color, SUM(value) as Total 
FROM count 
GROUP BY SUBSTRING_INDEX(color, '-', -1) 

出力動作するはずですあなたのクエリ内の修飾後

color Total 
pink 18 
red  21 

http://www.w3resource.com/mysql/string-functions/mysql-substring_index-function.php

1

あなたが句によって選択し、グループ内の機能を使用し、これを達成するために

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

機能を使用することができます。

1

SELECT SUBSTRING_INDEX(色、 ' - '、-1)総AS check_date AS single_color AS、

MAX(check_date)、

COUNT(*)、

合計(color_code < 1 OR color_code> ' - '、-1)

オードcheck_colors SUBSTRING_INDEX(色、BY

群から

AS CNT = 300) R BY cnt DESC LIMIT 10;