4

私は2つのテーブルを持っています:

  • ユーザー (user_id、user_connected)
  • 部屋 (room_id、room_initiating_user_id、room_target_user_id)

開始ユーザーと target_user の両方が「user_connected=0」に設定されているすべての「ルーム」を削除したいと思います。

ここには2つの問題があります:

  1. これらのユーザーをターゲットにする方法は? 明らかに、このクエリは機能しません。

    SELECT room_id
    FROM rooms,users
    WHERE
    ( 
     (room_target_user_id=user_id) AND (user_connected=0)
    )                   
    AND
    (                
     (room_initiating_user_id=user_id) AND (user_connected=0)
    )
    
  2. 可能であれば同じクエリを使用して、これらの部屋を削除したいと思います (2 番目のクエリを使用しても問題ありませんが、結果ごとにこのクエリがトリガーされることを意味します。これは大量の結果です。これらを削除することはできませんか?一度に部屋?

4

3 に答える 3

6
delete from rooms
where room_initiating_user_id in (select user_id from users where user_connected = 0)
  and room_target_user_id in (select user_id from users where user_connected = 0)
于 2012-05-08T01:33:10.737 に答える
0

JOINユーザーをターゲットにするには、2回テーブルを作成する必要がありますusers。1回は開始ユーザー用で、もう1回はターゲットユーザー用です。

SELECT room.room_id
FROM rooms room
INNER JOIN users initiating
ON room.room_initiating_user_id = initiating.user_id
INNER JOIN users target
ON room.room_target_user_id = target.user_id
WHERE initiating.user_connected=0 AND target.user_connected=0

これらの部屋を削除するには、上記をサブクエリとして使用できます。

DELETE FROM rooms
WHERE room_id IN (
    SELECT room.room_id
    FROM rooms room
    INNER JOIN users initiating
    ON room.room_initiating_user_id = initiating.user_id
    INNER JOIN users target
    ON room.room_target_user_id = target.user_id
    WHERE initiating.user_connected=0 AND target.user_connected=0
)
于 2012-05-08T01:30:35.970 に答える
0

まず、これらの部屋を選択するには、usersテーブルに2回参加する必要があります。

SELECT r.room_id
FROM rooms r 
    JOIN users tgt ON r.room_target_user_id = tgt.user_id
    JOIN users ini ON r.room_initiating_user_id = ini.user_id
WHERE tgt.user_connected = 0 AND ini.user_connected = 0

:2つの結合を区別するために、テーブルユーザーに2つの異なるエイリアスを使用します。また、推奨されていない古いコンマ結合ではなく、JOIN構文を使用しています

部屋を削除するには、複数のテーブルを削除する必要があります。

DELETE r
FROM rooms r 
    JOIN users tgt ON r.room_target_user_id = tgt.user_id
    JOIN users ini ON r.room_initiating_user_id = ini.user_id
WHERE tgt.user_connected = 0 AND ini.user_connected = 0
于 2012-05-08T01:33:51.627 に答える