2016-12-16 3 views
2

У меня есть две таблицы, называемые Класс и Уровни. Я хочу удалить c_id из класса, который не совпадает с 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

Вы должны сделать это в два этапа

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

я мог бы идти о делать это с помощью удаления присоединиться запроса между таблицами class и levels. Затем критерии для удаления записи являются двоякими. Он должен соответствовать вашему параметру запроса 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 

Update:

Из ваших последних комментариев, это похоже на то, что вы действительно ищете является каскадным удалением на class таблицы:

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

После добавления этого ограничения , удаление записи с class с удалением записи и также удалит любые записи в levels, точка t o запись в class.

+0

этот вопрос дает синтаксическую ошибку – shinzu

+0

@shinzu Извините, он должен читать 'DELETE t1 FROM class t1 ...'Пожалуйста, попробуйте еще раз –

+0

это говорит о неожиданном токене t1 – shinzu

0

Подзапрос для NOT EXISTS должен возвращать логическое значение, а php-код должен быть оптимизирован как litle.

$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'] . ' 
    ) 
;' 

Примечание: Не используйте параметры запроса непосредственно в SQL, для идентификатора просто разобрать значение в целое, для строки или что еще вы должны использовать mysqli_real_escape_string.

Смежные вопросы