0

データベースに 5 つのテーブルがあります: Category1 、 Category2 、 Category3 、 Category4 、 Category5

これらのテーブルで見つかる場合と見つからない場合があるユーザーがいます。もし彼が見つかったら、私は彼をテーブルから削除したい.

私はこのような5つのクエリでそれを行うことができます:

//search if the user is already subscribed in every one of the categories 
$stmt = $db->prepare("Select * FROM category1 WHERE deviceUDID = :deviceUDID"); 
$stmt->execute(array(':deviceUDID' => $deviceUDID));

if($rows_found = $stmt ->rowCount()) {    
  $stmt = $db -> prepare("DELETE FROM category1 WHERE deviceUDID =:deviceUDID");    
  $stmt->execute(array(':deviceUDID' => $deviceUDID));
}

次に、category2 の場合:

//search if the user is already subscribed in every one of the categories 
$stmt = $db->prepare("Select * FROM category2 WHERE deviceUDID = :deviceUDID"); 
$stmt->execute(array(':deviceUDID' => $deviceUDID));

if($rows_found = $stmt ->rowCount()) {    
  $stmt = $db -> prepare("DELETE FROM category1 WHERE deviceUDID =:deviceUDID");    
  $stmt->execute(array(':deviceUDID' => $deviceUDID));
}

残りのカテゴリについても同様です。

これらすべてのカテゴリを 1 つのクエリで検索して高速化することはできますか?

しかし、私はそのようなことがどのように起こるかの論理を見ることができません..何かアイデアはありますか?

エディット(ボーナスパート)


ユーザーがそこにいなくても、クエリが失敗しても、毎回 DELETE クエリを作成する方が簡単、高速、または効率的でしょうか?

または、最初にすべてのテーブルをチェックし、見つかった場合は DELETE クエリを作成する必要がありますか?

どちらがより効果的でしょうか?

4

4 に答える 4

2

アトミック性が心配な場合は、5 つの削除をトランザクションに含めることでカバーできます。

あるいは、mysql は外部キーとカスケード削除をサポートするようになったので、「ユーザー」テーブルとの外部キー関係を設定すれば、それ以上何もする必要がないかもしれません。

于 2013-05-03T11:38:52.843 に答える
1

いいえ。デバイスが存在するカテゴリを示すビューを作成することはできますが、更新することはできません。

create view allCategories as
 select 1 as category, *
 from   category1
 union
 select 2 as category, *
 from   category2
 union
 select 3 as category, *
 from   category3
 union
 select 4 as category, *
 from   category4
 union
 select 5 as category, *
 from   category5
于 2013-05-03T11:36:56.890 に答える
1

DELETE 句を使用すると、1 つの要求で多くのテーブルを使用できます。試してみる :

DELETE FROM category1 c1, category2 c2, categorie3 c3 WHERE c1.deviceUDID= :deviceUDID AND c2.deviceUDID= :deviceUDID AND c3.deviceUDID= :deviceUDID ...
于 2013-05-03T11:37:45.160 に答える
0

DELETE FROM category1 WHERE deviceUDID in (Select * FROM category2 WHERE deviceUDID = :deviceUDID)あなたが探しているものです。

于 2013-05-03T11:34:17.813 に答える