2010-04-14 4 views
4

У меня есть таблица данных, в которой есть сообщения, тогда у меня есть отдельная таблица данных, которая удаляет сообщения. Что происходит, когда сообщение удаляется, так это то, что идентификатор get добавляется в удаленную таблицу, а не удаляет запись.MySQL Выберите инструкцию Where table1.id! = Table2.id

Что такое чистый эффективный способ выбора всех сообщений из таблицы сообщений, не выбирая те, которые имеют свой идентификатор удаляемой таблицы

ответ

2

Если вы не можете изменить таблицы, вы можете сделать Left Join (который присоединитесь к вашему deleted_table, когда это возможно), а затем проверьте, что id будет Null (это означает, что строки не найдено).

Select everything_you_need 
From post_table p 
Left Join delete_table d On (d.id = p.id) 
Where d.id Is Null; 

Убедитесь, что есть индексы на обоих id -columns для лучшей производительности.

2

Не было бы проще добавить дополнительный столбец в таблицу сообщений и сохранить и логическое значение удалено? Или используйте целое поле (для представления идентификатора пользователя), если вы хотите сохранить, кто его удалил, 0 = не удалили.

+0

Это было бы проще, но это для сторонней инфраструктуры, которую я не разработал, и я не могу изменить ее структуру. – Michael

1

Если у вас есть хорошая причина, чтобы не использовать логический флаг, как предполагает bigstylee, вы можете использовать EXISTS подзапрос:

SELECT * FROM table1 
    WHERE NOT EXISTS 
    (SELECT * FROM table2 WHERE table1.id=table2.id); 
+1

это будет работать, но простое левое соединение будет намного проще, чем выполнение подзапроса. – oezi

+0

Я не согласен. Это кажется мне более понятным и понятным для меня, поскольку оно на самом деле говорит о том, что вы делаете. В этом простом примере Mysql будет оптимизировать его же .. – Tomas

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