0

MySQL クエリを作成する際のヘルプを探しています。

各行には、同じ conversation_id を持つ行が少なくとも 2 つあります。同じ会話IDを持つすべての行の受信者状態フィールドに「削除」があるものを選択したい。

SELECT conversation_id
FROM xf_conversation_recipient
GROUP BY recipient_state HAVING (delete in all fields)

次の conversation_id が選択されます

conversation_id recipient_state
1               delete
1               delete

次の conversation_id は選択されません

conversation_id recipient_state
1               delete
1               active
4

3 に答える 3

2
SELECT conversation_id, COUNT(DISTINCT recipient_state) AS nb, recipient_state
FROM xf_conversation_recipient
GROUP BY conversation_id
HAVING nb=1 AND recipient_state='delete'

このクエリは、conversation_id でグループ化し、1 つの個別の recipient_state を持ち、recipient_state が「delete」に等しいレコードのみを保持します。

于 2013-04-17T18:00:40.190 に答える
0

xf_conversation_recipient次のような表があるとします。

+----------------+----------------+
|conversation_id |recipient_state |
+----------------+----------------+
|1               |delete          |
|1               |delete          |
|2               |active          |
|2               |delete          |
|3               |delete          |
|3               |delete          |
|4               |active          |
|4               |delete          |
|5               |active          |
|5               |active          |
|6               |delete          |
|6               |delete          |
+----------------+----------------+

次のクエリは、条件に一致するすべての会話の ID を返します

SELECT 
    conversation_id AS selectedId, 
    count(*) AS count    
FROM xf_conversation_recipient   
WHERE recipient_state = "delete" 
GROUP BY conversation_id 
HAVING count>1 

戻り値:

+-----------+------+
|selectedId |count |
+-----------+------+
|1          |2     |
|3          |2     |
|6          |2     |
+-----------+------+

アプリケーションによっては、ここで終了する場合があることに注意してください。


selectedIdこのクエリをネストすると、列のみを抽出でき、再度ネストするとIN、次のようにクエリの条件として使用できます。

SELECT * FROM xf_conversation_recipient 
WHERE xf_conversation_recipient.conversation_id IN (
    SELECT t1.selectedId FROM (
        SELECT 
            conversation_id AS selectedId, 
            count(*) AS count
        FROM xf_conversation_recipient
        WHERE recipient_state = "delete"
        GROUP BY conversation_id
        HAVING count>1
    ) t1  
)

どちらが返されますか:

+----------------+----------------+
|conversation_id |recipient_state |
+----------------+----------------+
|1               |delete          |
|1               |delete          |
|3               |delete          |
|3               |delete          |
|6               |delete          |
|6               |delete          |
+----------------+----------------+
于 2013-04-17T19:38:27.263 に答える
0

私が思いつくことができる最善の方法は、自己左結合です。

SELECT DISTINCT r1.conversation_id
FROM xf_conversation_recipient AS r1
LEFT JOIN xf_conversation_recipient AS r2 ON r2.conversation_id = r1.conversation_id AND r2.recipient_state != 'delete'
WHERE r1.recipient_state = 'delete' AND r2.conversation_id IS NULL

基本的に、状態が「削除」でない一致する行がないすべての行を取得します。

于 2013-04-17T17:34:59.350 に答える