2016-09-29 13 views
2

私は3つのテーブルを持っており、私はいくつかのデータを取得するためにそれらに参加しています。GROUP_CONCAT選択の条件

 
----------------- 
Table Name: users 
------------------------------- 
|user_id | user_name | 
------------------------------- 
123  | abc 
------------------------------- 
223  | bcd 
------------------------------- 
323  | cde 
------------------------------- 

----------------- 
Table Name: limit 
------------------------------- 
user_id | limit_id 
------------------------------- 
123  | 1 
------------------------------- 
223  | 2 
------------------------------- 
323  | 3 
------------------------------- 
323  | 4 
------------------------------- 

------------------------- 
Table Name: limit_setting 
------------------------------- 
limit_id | date_limit 
------------------------------- 
1  | 2016-09-29 12:00:00 
------------------------------- 
2  | 2016-09-28 12:00:00 
------------------------------- 
3  | 2016-09-27 12:00:00 
------------------------------- 
1  | 2016-09-27 12:00:00 
------------------------------- 
1  | 2016-09-24 12:00:00 
------------------------------- 
4  | 2016-09-25 12:00:00 
------------------------------- 
4  | 2016-09-26 12:00:00 
------------------------------- 

このような結果を得る必要があります。私は日付列のGROUP_CONCATについています。 日付の列は、MAXの日付以外のすべての項目を含む必要があります。そのリミットIDのlimit_settingテーブルにエントリが1つしかない場合、そのユーザーには何も表示されません。 count_dateslimit_settingテーブルに存在するエントリの数。

 

Desired output 

---------------------------------------------------------------------- 
user_name | dates          | count_dates 
---------------------------------------------------------------------- 
abc  | 2016-09-27 12:00:00 , 2016-09-24 12:00:00 | 3 
---------------------------------------------------------------------- 
bcd  |            | 1 
---------------------------------------------------------------------- 
cde  |            | 1 
----------------------------------------------------------------------- 
cde  | 2016-09-26 12:00:00       | 2 
----------------------------------------------------------------------- 
SELECT PP.`user_name`, count(ESL.Limit_id) as count_dates, 
    GROUP_CONCAT(ESL.date_limit SEPARATOR ',') as dates 
FROM users as PP INNER JOIN `limit` as PAL ON PP.Id = PAL.PlayerId 
LEFT JOIN limit_setting as ESL ON ESL.LimitId = PAL.limitId 
GROUP BY PAL.limitId 

さらに私は、私はそれを効果的に使用する方法がわからFind_in_setと試みたがない(何も返されない)で

SELECT ESL.date_limit, MAX(date_limit) as max_date, PP.`user_name`, count(ESL.Limit_id) as count_dates, 
    GROUP_CONCAT(ESL.date_limit SEPARATOR ',') as dates 
FROM users as PP INNER JOIN `limit` as PAL ON PP.Id = PAL.PlayerId 
LEFT JOIN limit_setting as ESL ON ESL.LimitId = PAL.limitId 
GROUP BY PAL.limitId 
HAVING ESL.date_limit > max_date 

を試してみました。

答えて

1

これを試してみてください:

SELECT user_name,   
     CASE WHEN COUNT(*) > 1 
      THEN SUBSTRING_INDEX(GROUP_CONCAT(date_limit ORDER BY date_limit), 
           ',', COUNT(*) - 1) 
      ELSE '' 
     END AS dates,    
     COUNT(*) AS count_dates 
FROM users as PP 
INNER JOIN `limit` as PAL ON PP.user_id = PAL.user_id 
LEFT JOIN limit_setting as ESL ON ESL.limit_id = PAL.limit_id 
GROUP BY user_name 

クエリが最後の日から除いGROUP_CONCATによって返されたすべての日付を取得するためにSUBSTRING_INDEX機能を使用しています。 ORDER BYGROUP_CONCATの中に使用すると、末尾に最大日付を置くことができるので、SUBSTRING_INDEXはこの日付を正確に切り捨てます。

Demo here

+0

感謝あなたはあまりにも助けと説明のために...私は決して前に 'SUBSTRING_INDEX'を使用したことはありませんし、それについては全く考えていませんでした...もう一度感謝:) – user2595861

0

私はcase式でgroup_concat()から最大日付を排除するために限界あたりの最大の日付を返し、リミット設定テーブルに、このバックに参加するためにサブクエリを使用します。

SELECT 
    PP.`user_name`, 
    count(ESL.Limit_id) as count_dates, 
    GROUP_CONCAT(CASE 
        WHEN ESL.date_limit<>ls.maxdate THEN ESL.date_limit 
        ELSE '' 
       END SEPARATOR ',') as dates 
FROM users as PP 
INNER JOIN `limit` as PAL ON PP.Id = PAL.PlayerId 
LEFT JOIN limit_setting as ESL ON ESL.LimitId = PAL.limitId 
LEFT JOIN (SELECT LimitId, MAX(date_limit) as maxdate 
      FROM limit_setting 
      GROUP BY LimitId 
     ) ls ON ESL.LimitId=ls.LimitId 
GROUP BY PP.`user_name` 
+0

私はこれでも結果を得ましたが、 'dates'フィールドの始めにはこうなります:'、2016-09-23 00:00:00,2016-09-21 00:00:00,20 16-09-2..' – user2595861