Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Join a ilość rekordów - problem
Forum PHP.pl > Forum > Bazy danych > MySQL
rzymek01
Witam!

Skonstruowałem sobie zapytanie:

  1. 'SELECT c.name
  2. FROM '.PX.'categories as c
  3. LEFT JOIN '.PX.'categories as c2 ON c2.id = '.$cid.'
  4. LEFT JOIN '.PX.'maincat as mc ON mc.id = c2.maincat_id
  5. WHERE c.id IN (SUBSTRING_INDEX(mc.children_ids, CONCAT(",", "'.$cid.'"), 1))';


zakładając, że $cid to 5 i że wynikiem funkcji SUBSTRING_INDEX jest `1,3,4`, uproszczam zapytanie do:
  1. 'SELECT c.name
  2. FROM categories as c
  3. LEFT JOIN categories as c2 ON c2.id = 5
  4. LEFT JOIN maincat as mc ON mc.id = c2.maincat_id
  5. WHERE c.id IN (1,3,4)';


i teraz działa, lecz jak znowu zamienię 1,3,4 na SUBSTRING_INDEX(mc.children_ids, CONCAT(",", "'.$cid.'"), 1), którego wynikiem też jest 1,3,4 to pokazuje tylko jeden rekord zamiast 3...



Pozdrawiam i z góry dziękuję!
JoShiMa
Po pierwsze sprawdź, czy w pierwszym przypadku zapytanie na prawdę Ci się dobrze konstruuje. Wyświetl je za pomocą echo i zobacz czy jest identyczne z drugim wariantem.

A jesteś pewien, że
SUBSTRING_INDEX(mc.children_ids, CONCAT(",", "'.$cid.'"), 1)
daje wynik 1,3,4? Jakoś mi na to nie wygląda.
nevt
sam napisałeś:
Cytat
zakładając, że $cid to 5 i że wynikiem funkcji SUBSTRING_INDEX jest `1,3,4`

zatem w pierwszym wariancie otrzymujesz:
  1. ... WHERE c.id IN ('1,3,4')

a to nie to samo, co w drugiej wersj:
  1. ... WHERE c.id IN (1,3,4)
rzymek01
nevt, macz rację smile.gif to jest jako string, jak to zamienić na format przyjazny dla IN? biggrin.gif

albo:

jak zrobić z pola tekstowego:
  1. 1,2,3,4,5

mając dane np. 4 takie coś:
  1. 1,2,3

czyli ucinamy tekst od początku do wystąpienia w tym wypadku 4 smile.gif


Pozdrawiam
nevt
spróbuj np.:
  1. ... WHERE INSTR('1,3,4', c.id);
rzymek01
nie rozumiem co mam zrobić z instr, który zwraca tylko pozycję znalezionego podciągu sadsmiley02.gif

edit:
jest coś takiego w mysql jak eval w php? smile.gif
nevt
wklej sobie na próbę dokładnie tak jak podałem - zobaczysz, że działa...
a łopatologicznie - jak znajdzie - zwraca liczbę większą od zera, która w warunku WHERE zmieniana jest na logiczne TRUE
a jak nie znajdzie - to zwraca zero - które w warunku WHERE zmieniane jest na logiczne FALSE ...
cała tajemnica...
rzymek01
rozumiem, dzięki wielkie biggrin.gif

wczoraj byłem jakiś ciężki sciana.gif


//edit:
działa, tylko wadą tego rozwiązania jest nieoptymalność takiej operacji, bo w przypadku IN wybiera podane rekordy, a w INSTR sprawdza wszystkie rekordy co przy dużej liczbie kategorii może znacznie wydłużyć czas takiego zapytania
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.