1

mysql データベースからレコードを取得する必要があります。この表には、ユーザーに関連付けられたアクションのリストがあります。列アクション = 3 および列アクション = 5 を持つすべてのユーザーを取得する必要があります。たとえば、ユーザー番号の場合。4 にはアクション = 3 のレコードとアクション = 5 のレコードがあります。ユーザーが action = 3 または action = 5 のレコードを 1 つしか持っていない場合、それを取得してはなりません。このクエリを書くと

SELECT * 
FROM user_action 
WHERE action = 3 AND action = 5

私は常に0レコードを取得します。AND の代わりに OR を書くと、ユーザーが両方の値を持っていなくても、action = 3 または action = 5 を持つすべてのレコードが取得されます。どうすればいいですか?

4

1 に答える 1

4

この問題はやや呼ばれますRelational Division

SELECT  userID
FROM    user_action
WHERE   action IN (3,5)
GROUP   BY userID
HAVING  COUNT(DISTINCT action) = 2

actionがすべてで一意の場合、レコードをuserID直接使用せずに直接取得できますCOUNT()DISTINCT

SELECT  userID
FROM    user_action
WHERE   action IN (3,5)
GROUP   BY userID
HAVING  COUNT(*) = 2

最後に、ユーザーの詳細全体を取得したい場合は、それ自体と結合する必要があります。

SELECT  a.*
FROM    user_action a
        INNER JOIN
        (
            SELECT  userID
            FROM    user_action
            WHERE   action IN (3,5)
            GROUP   BY userID
            HAVING  COUNT(*) = 2
        ) b ON a.userID = b.userID
于 2013-03-11T13:40:47.200 に答える