Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] zapytanie do mysql 3.23.58 a mysql 4.1.22
Forum PHP.pl > Forum > Przedszkole
czerwony2
witam

Zrobiłem ostatnio zapytanie do bazy za pomocą LEFT JOIN i NOT IN wygląda ono tak:
  1. $sql = "SELECT $newsy.*
  2. FROM $newsy LEFT JOIN $tabela ON $newsy.id=$tabela.id_newsa
  3. WHERE $newsy.id NOT IN ($tabela.id_newsa) AND $newsy.utworzony NOT LIKE '$warunek' AND $newsy.dzial LIKE '$dzial'
  4. ORDER BY $newsy.utworzony desc";


było wszystko fajnie, pod moim krasnalem w którym jest zainstalowany mysql 3.23.58-max-debug wszystko pięknie działało (dawało pożądany rezultat, czyli wyciągnąć z tabeli $newsy wszystkie newsy których nie ma nr id w tabeli $tabela). Niestety po wrzuceniu na serwer na którym jest zainstalowany mysql 4.1.22-log okazało sie ze zapytanie nie daje takiego samego rezultatu.

I tu moje pytanie: dlaczego tak jest i w czym może tkwić problem?
pozdrawiam
dadexix
a jaki daje rezultat?

Cytat
Note that INNER JOIN syntax allows a join_condition only from MySQL 3.23.17 on. The same is true for JOIN and CROSS JOIN only as of MySQL 4.0.11.
nie znam się praktycznie na mySQL a żeby rozumieć coś po angliku potrzebuje wiedzieć o czym mowa ale chyba to mówi że parametr join condition został usunięty/zmieniony/itd. w wersji mysql 4.0.11 i działa inaczej niż w mysql 3.23.17(lub niżej)

Cytat
FROM $newsy LEFT JOIN $tabela ON $newsy.id=$tabela.id_newsa
podkreśliłem które to join_condition


http://dev.mysql.com/doc/refman/4.1/en/join.html
czerwony2
Rezultat tego zapytania pod mysqla 4.1.22 jest taki że nie daje żadnych wyników (nie wyciąga żadnych rekordów) a pod mysqlem 3.23 daje pożądane.
W takim razie jak powinno wyglądać zapytanie pod mysqla 4.1 by dało taki sam rezultat jak pod 3.23, bo już nie mam pomysłu??
drPayton
Tak na szybko, spróbuj i napisz czy będzie ok:
  1. $sql = "SELECT $newsy.*
  2. FROM $newsy LEFT JOIN $tabela ON $newsy.id != $tabela.id_newsa
  3. WHERE $newsy.utworzony NOT LIKE '$warunek' AND $newsy.dzial LIKE '$dzial'
  4. ORDER BY $newsy.utworzony desc";
czerwony2
Niestety zapytanie:
  1. $sql = "SELECT $newsy.*
  2. FROM $newsy LEFT JOIN $tabela ON $newsy.id != $tabela.id_newsa";

daje wynik w postaci wszystkich wpisów które sa w tabeli $newsy, łącznie z tymi co nr id jest dodany do $tabela.id_newsa (a tych chciał bym sie pozbyć).

Wydaje mi sie że problem nie polega tyle co w LEFT JOIN tylko w NOT IN. O ile wiem to IN wyświetla wartości (w tym przypadku z $tabela.id_newsa) które pasują do wzorca (w tym przypadku do $newsy.id). Na zdrowy rozsądek i z tego co wyczytałem NOT IN powinno działać odwrotnie do IN czyli wyświetlać wiersze z tabeli które nie pasują do wzorca. A tak niestety nie jest sad.gif! Dlaczego?questionmark.gifquestionmark.gif Macie jakiś pomysł jak wyświetlić wiersze których id nie jest dodane do tabeli $tabela?

OK problem rozwiązany. Zapytanie powinno wyglądać tak:
  1. $sql = "SELECT $pkp_newsy.*
  2. FROM $pkp_newsy LEFT JOIN $tabela ON $pkp_newsy.id=$tabela.id_newsa
  3. WHERE $pkp_newsy.id NOT IN (SELECT $tabela.id_newsa FROM $tabela)";


Wychodzi na to że mysql 4.1 wymaga aby zbiór do którego porównujemy za pomocą operatora logicznego NOT IN był wyciągany z innej tabeli za pomocą wewnętrznego zapytania
  1. SELECT $tabela.id_newsa FROM $tabela

czego mysql 3.2 nie trawi i wypluwa błąd. Pozostaje mi uaktualnienie mojego mysqla w krasnalu aby więcej nie mieć takich niespodzianek, chyba że polecicie mi jakiś inny system lokalnego serwera bardziej aktualny niż krasnal...

Pozdrawiam
Liko
http://www.wampserver.com/en/ <- polecam smile.gif
Jak masz trochę czasu, i chęci to zawsze możesz pościągać wszystkie składniki osobno i zainstalować samodzielnie...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.