(NOT) EXISTS w MySQL – rezultaty zależne

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:

http://mynthon.net/articles/inne/sql_szybkie_zapytania

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA
Change the CAPTCHA codeSpeak the CAPTCHA code
 

This site uses Akismet to reduce spam. Learn how your comment data is processed.