У меня есть таблица:
NACHRICHT_ID | VERFASSER_USERNAME | BETREFF | TEXT | DATUM | EMPAENGER_ID ------------------------------------------------------------------------------ | | | | 2009-07-01| 1 | h | hfgh | hfgh | 23:15:10 | 31 ------------------------------------------------------------------------------ | | | | 2009-07-02| 3 | h | hfgh | hfgh | 00:30:10 | 31 ------------------------------------------------------------------------------ | | | | 2009-07-02| 4 | q | hfgh | hi | 11:42:06 | 31 ------------------------------------------------------------------------------ | | | | 2009-07-02| 5 | h | hfgh | hfgh | 12:53:56 | 31 ------------------------------------------------------------------------------ | | | | 2009-07-02| 6 | h | hfgh | hfgh | 13:19:53 | 31 ------------------------------------------------------------------------------ | | | | 2009-07-02| 7 | h | hfgh | hfgh | 13:20:18 | 31 ------------------------------------------------------------------------------ | | | | 2009-07-02| 8 | mkd | hfgh | hfgh | 13:47:32 | 31 ------------------------------------------------------------------------------ | | | | 2009-07-02| 9 | h | hfgh | hfgh | 16:42:10 | 31 ------------------------------------------------------------------------------
Я пытаюсь удалить строку, где NACHRICHT_ID = 3
:
DELETE FROM NACHRICHTEN JOIN
NACHRICHTEN_EMPFAENGER_MAP USING (NACHRICHT_ID)
WHERE EMPFAENGER_ID = 31 && NACHRICHT_ID = 3 ;
Но он не работает. Что я делаю неправильно?
Твой вопрос непонятен.
У вас есть 3 таблицы:
Вы хотите удалить новость? Затем сделайте следующее:
delete from NACHRICHTEN where NACHRICHT_ID = 3;
Если вы хотите удалить сопоставление между новостным элементом с идентификатором 3 и получателем с идентификатором 31, сделайте следующее:
delete from NACHRICHTEN_EMPFAENGER_MAP where NACHRICHT_ID=3 and EMPFAENGER_ID=31;
Если вы хотите удалить фактического получателя с идентификатором 31, сделайте это (при условии, что таблица называется EMPFAENGER)
delete from EMPFAENGER where EMPFAENGER_ID = 31;
Если вы хотите сделать что-то еще, задайте вопрос с подробной информацией.
Соединение - это операция, которая создает временную таблицу на основе данных из нескольких других таблиц и извлекает значения из этой временной таблицы, а затем отбрасывает ее (это концепция, а не фактическая реализация).
Таким образом, удаление "из" или "после объединения" - это идея, которая не имеет большого смысла. Но если я правильно разобрался, вы просто хотите удалить сообщение (Nachricht). Вы должны просто удалить это сообщение из таблицы сообщений, как показано в других ответах.
После этого, если вы сделаете свой SELECT * FROM ... JOIN ...
, вы увидите, что сообщение также отсутствует в результате соединения.
Я надеюсь, что это поможет.
PS: Нет необходимости кричать на людей, которые пытаются вам помочь.
DELETE FROM 'table' WHERE NACHRICHT_ID = 3
Я предполагаю, что вы используете MyISAM
как ваш механизм хранения, который, к сожалению, не поддерживает внешние ключи.
Итак, учитывая следующие таблицы:
A
---
A_ID (PK), A_SOMETHING
B
---
B_ID (PK), B_SOMETHING
C
---
A_ID (PK, FK), B_ID (PK, FK)
Если вы хотите удалить все As, которые связаны с B_ID = 13, вы можете сделать следующее.
DELETE FORM A WHERE A_ID IN (SELECT A_ID FROM C WHERE B_ID = 13);
Или, если вы хотите удалить все как там, где связанное значение B B_SOMETHING равно 'Foo':
DELETE FORM A WHERE A_ID IN
(SELECT C.A_ID FROM B,C
WHERE B.B_ID = C.B_ID
AND B.B_SOMETHING = 'Foo'
);
После этого вы выполните некоторую очистку:
DELETE FROM C WHERE A_ID NOT IN (SELECT A_ID FROM A);
Теперь все это вручную, и вам лучше использовать механизм хранения с поддержкой внешних ключей (InnoDB
).
Вы должны предоставить снимок экрана из всех соответствующих таблиц, а не только результат. Это сделало бы ваш вопрос намного яснее.
DELETE FROM NACHRICHTEN
WHERE EMPFAENGER_ID = 31 && NACHRICHT_ID = 3;
http://dev.mysql.com/doc/refman/5.0/en/delete.html - ответ есть