Podzapytania w MySQL z użyciem (NOT) EXISTS,
czyli rezultaty zależne od wyników z innej tabeli.
Ostatnio musiałem znaleźć w sieci informację, jak za pomocą zapytania MySQL edytować rekordy, o których informacje nie znajdują się w innej tabeli.
Aby poćwiczyć, najpierw próbowałem je wyszukać:
$result=mysql_query(“SELECT * FROM www_vocabulary WHERE NOT EXISTS (SELECT * FROM www_vocabulary_categories WHERE www_vocabulary.cat_id = www_vocabulary_categories.id) AND cat_id != 0”);
while ($get=mysql_fetch_array($result))
{
echo $get[‘id’];
}
W mojej bazie danych w tabeli www_vocabulary trzymam wyrazy języków obcych. W tabeli www_vocabulary_categories można pogrupować sobie wyrazy w różne kategorie. Działa to tak, że w tabeli www_vocabulary w kolumnie cat_id przechowywane są wartości id poszczególnych kategorii. Z pewnych względów których jeszcze nie rozwiązałem, czasami pojawia się sytuacja, gdy jakiś wyraz ma przypisane id kategorii, która już nie istnieje.
Nie pamiętam teraz dokładnie w którym miejscu kodu mojej strony to występowało, ale chodziło o to, że niezabezpieczony przed powtórnym wysłaniem (F5) formularz kasował kategorię, pozostawiając wszystkie wyrazy z indeksem nieistniejącego już rekordu, chociaż powinny być automatycznie zamienione na “0” – czyli wskaźnik “nie przypisania” do jakiejkolwiek kategorii.
Co robi powyższe zapytanie? Wyszukuje wszystkie rekordy w tabeli www_vocabulary, które posiadają wartość w polu cat_id, która nie istnieje w tabeli www_vocabulary_categories.id i dodatkowo wyraz nie ma przypisanej wartości “0” – ponieważ wartość zero, pomimo, że nie istnieje w www_vocabulary_categories, jest wartością prawidłową i oznacza brak kategorii.
Ale wyszukanie było tylko i wyłącznie dla poćwiczenia. Teraz “opuszczone” wyrazy muszą mieć zmienioną wartość na “0” w polu cat_id:
Robimy to bardzo podobnym zapytaniem:
$edit=”UPDATE www_vocabulary SET cat_id=0 WHERE NOT EXISTS
(SELECT * FROM www_vocabulary_categories WHERE www_vocabulary.cat_id = www_vocabulary_categories.id) AND cat_id != 0″;
Źródło: