2016-12-16 21 views
2

クラスレベルの2つのテーブルがあります。レベルはです。 Levelsのc_idでmatcheしていないClassからc_idを削除します。私はここのようなクエリによってこれを行うことができます。テーブルから他のテーブルに存在しないデータを削除

DELETE FROM class WHERE NOT EXISTS (SELECT * FROM levels WHERE levels.c_id=class.c_id) 

しかし、私はこのようなリンクで動作するクエリでそれをやってみたい:

DELETE FROM class WHERE NOT EXISTS (SELECT * FROM levels WHERE levels.c_id=class.c_id) WHERE c_id = '$_GET['del_id']'; 

しかし、私はこれを達成することができません。親切に私を助けてください。

+0

最終的な追加のWHERE条件が制限されているとは私には分かりません。これについて詳しく説明できますか? –

+0

あなたはFacebookやWhatsapを持っていますか?私はuの写真を送ってみましょう。スナップショット – shinzu

+0

LOL ...多分それを控えてください。追加の 'WHERE'という用語' c_id = '$ _GET [' del_id ']' 'はどうするのですか? –

答えて

0

あなたは、私がclasslevelsテーブル間のクエリを結合を削除経由でこれを行うことについては行くかもしれない二つのステップ

if (!isset($_GET['del_id'])) { 
    die("Invalid ID specified."); 
} 
$c_id_get = '$_GET['del_id']' 


$sql = "DELETE FROM class WHERE NOT EXISTS (SELECT * FROM levels WHERE levels.c_id=class.c_id && c_id='{$c_id_get}')"; 
mysqli_query($connection,$sql); 
0

でこれを行う必要があります。レコードを削除する基準は2つある。 PHPクエリパラメータと一致していなければなりません。また、levelsテーブルに存在してはいけません。 classのレコードのマーカーはlevelsに存在しません。この場合、LEFT JOINにはNULL結合列が存在することになります(したがって、IS NULLを確認してください)。

DELETE t1 
FROM class t1 
LEFT JOIN levels t2 
    ON t1.c_id = t2.c_id 
WHERE t1.c_id = $_GET['del_id'] AND   -- matches correct class ID 
     t2.c_id IS NULL      -- and not present in 'levels' table 

更新:あなたが本当に探しているものをカスケードがclassテーブルに削除されたように、あなたの最近のコメントから

は、それが聞こえる:

ALTER TABLE levels 
ADD CONSTRAINT `fk_id` 
FOREIGN KEY (c_id) 
REFERENCES `class` (`c_id`) 
ON DELETE CASCADE 

この制約を追加した後classからレコードを削除してレコードを削除すると、levelsのレコードが削除されますo classのレコード。

+0

このクエリは構文エラー – shinzu

+0

@shinzuを与えています申し訳ありませんが、 'DELETE t1 FROM class t1 ...'もう一度やり直してください。 –

+0

予期せぬトークンがあります。t1 – shinzu

0

NOT EXISTSのサブクエリはブール値を返し、PHPコードはこのように最適化する必要があります。

$sql = 'DELETE FROM `class` 
    WHERE NOT EXISTS (
     SELECT 1 FROM `levels` 
      WHERE `levels`.`c_id` = ' . (int) $_GET['del_id'] . ' 
    ) 
;' 

あなたもそのためNOT INを使用することができます。

$sql = 'DELETE FROM `class` 
    WHERE `class`.`c_id` NOT IN (
     SELECT `levels`.`c_id` FROM `levels` 
      WHERE `levels`.`c_id` = ' . (int) $_GET['del_id'] . ' 
    ) 
;' 

注:idは単にintに値を解析するために、文字列のために、あなたのSQLに直接リクエストパラメータを使用しないでくださいをか他にmysqli_real_escape_stringを使うべきです。

関連する問題