Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] usuwanie rekordów, jeśli w drugiej tabeli nie ma rekordu o odpowiednim id, a dokladniej komentarzy pozostających po skaskowanych artykułach
ficiek
post 22.11.2011, 23:13:05
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 1
Dołączył: 9.09.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Witam mam dwie tabele: comments i articles.
Rekordy w articles mają oczywiście id, natomiast komentarze about_id, które odpowiada odpowiednim id artykułów do których są przypisane.
Chcę w jednym zapytaniu mieć możliwość usunięcia wszystkich przestarzałych komentarzy, czyli takich których odpowiadające artykuły usunięto.

Chodzi mi o coś w stylu:
  1. DELETE FROM comments WHERE about_id NOT IN (SELECT id FROM articles)

Niestety nie wiem jak dokładnie to zapisać.
Go to the top of the page
+Quote Post
AlexDeLarge
post 22.11.2011, 23:24:01
Post #2





Grupa: Zarejestrowani
Postów: 85
Pomógł: 14
Dołączył: 14.02.2010

Ostrzeżenie: (0%)
-----


  1. DELETE FROM comments RIGHT JOIN articles ON comments.about_id=articles.id WHERE articles.id IS NULL


LUB

  1. ALTER TABLE comments ENGINE=InnoDB;
  2. ALTER TABLE articles ENGINE=InnoDB;
  3. ALTER TABLE comments ADD FOREIGN KEY 'fk_articles' REFERENCES articles(id) ON DELETE CASCADE;


i...magia, działa samo bez dodatkowych zapytań. Ale uwaga, jeśli korzystasz z wyszukiwania FULLTEXT w jednej z tabel, nie możesz tego zrobić.

//RIGHT JOIN, albo LEFT, zawsze mi się pier...

Ten post edytował AlexDeLarge 22.11.2011, 23:25:06


--------------------
Java and PHP developer 2007-2014 :)
Go to the top of the page
+Quote Post
ficiek
post 23.11.2011, 19:07:39
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 1
Dołączył: 9.09.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Dzięki, nie mam niestety czasu sprawdzić tego w tym momencie, ale owszem, korzystam z FULLTEXT w tabeli articles. Rozumiem, że w tym wypadku nie zadziała druga możliwość?
Go to the top of the page
+Quote Post
AlexDeLarge
post 23.11.2011, 21:42:56
Post #4





Grupa: Zarejestrowani
Postów: 85
Pomógł: 14
Dołączył: 14.02.2010

Ostrzeżenie: (0%)
-----


No niestety, jeśli korzystasz z wyszukiwania FULLTEXT, to korzystasz z MyISAM, a MyISAM nie obsługuje kluczy obcych.
Sposób numer 3, jeśli masz możliwość tworzenia wyzwalaczy:

  1. delimiter |
  2. CREATE TRIGGER deletecom AFTER DELETE ON articles
  3. FOR EACH ROW BEGIN
  4. DELETE FROM comments WHERE about_id=OLD.id;
  5. END;
  6. |
  7. delimiter ;


Poza tym wkradł się błąd w sposobie numer 2, powinno być:

  1. ALTER TABLE comments ADD CONSTRAINT 'fk_articles' FOREIGN KEY (about_id) REFERENCES articles(id) ON DELETE CASCADE;


Ten post edytował AlexDeLarge 23.11.2011, 21:43:13


--------------------
Java and PHP developer 2007-2014 :)
Go to the top of the page
+Quote Post
ficiek
post 9.12.2011, 20:51:23
Post #5





Grupa: Zarejestrowani
Postów: 28
Pomógł: 1
Dołączył: 9.09.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Tak sobie przypomniałem o tym temacie.

Rozwiązanie które wykorzystałem:
  1. SELECT * FROM comments D WHERE NOT EXISTS (SELECT NULL FROM articles U WHERE D.about_id = U.id)


To jest tylko SELECT więc swobodnie można testować nie bojąc się, że coś nam zniknie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 01:10