2

私はこのテーブルを持っています...

--------------------------------------
| user_id |  status   |  status_date |
--------------------------------------
|    1    |  Current  |  2012-08-01  |
|    1    |  Referral |  2012-03-14  |
|    2    |  Referral |  2012-04-23  |
|         |           |              |
--------------------------------------

照会日が 2012-06-30 より前で、現在の日付が 2012-06-30 より後か、または現在のステータス レコードがまったくない個別の user_id を検索するには、どうすればよいでしょうか?

データベースはMySQLです。

4

3 に答える 3

2

LEFT JOIN を使用してこれを行うことができます。

SELECT  DISTINCT T.User_ID
FROM    T
        LEFT JOIN T T2
            ON t.User_ID = T2.User_ID
            AND t2.Status = 'Current'
WHERE   T.Status_Date < '20120630'
AND     T.Status = 'Referral'
AND     (t2.Status_Date > '20120630' OR t2.Status_date IS NULL)

または、 と を使用GROUP BYHAVINGCOUNT(CASE ...)

SELECT  t.User_ID
FROM    T
GROUP BY t.user_ID
HAVING  COUNT(CASE WHEN t.Status = 'Referral' AND t.Status_Date < '20120630' THEN 1 END) > 0
AND (   COUNT(CASE WHEN t.Status = 'Current' AND t.Status_Date > '20120630' THEN 1 END) > 0
    OR  COUNT(CASE WHEN t.Status = 'Current' THEN 1 ELSE 0 END) = 0
    )

どちらのパフォーマンスが優れているかは、インデックスとデータの量によって異なります。ほとんどの場合、前者になると思います

于 2012-10-30T16:58:01.233 に答える
1

これはそれを行う必要があります:

SELECT DISTINCT user_id
FROM YourTable T
WHERE status = 'Referral' 
AND status_date < '2012-06-30'
AND NOT EXISTS (SELECT user_id FROM YourTable 
                WHERE user_id = T.user_id AND status = 'Current' 
                AND status_date < '2012-06-30')
于 2012-10-30T16:53:18.100 に答える
0

MySQL で内部選択を行うことは避けてください。5.5 までのすべてのバージョンは、それらを使用して適切に最適化することはできません。JOIN を使用します。

SELECT distinct t1.user_id 
  FROM tablename t1 
  LEFT JOIN tablename t2 on t1.user_id = t2.user_id AND t1.status != t2.status
  WHERE t1.status = 'Referral' 
        AND t1.status_date '2012-06-30' 
        AND ( (t2.status IS NULL) OR 
              (t2.status = 'Current' AND t2.status_date > '2012-06-30'));
于 2012-10-30T16:53:29.637 に答える