Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Join a ilość rekordów - problem
rzymek01
post
Post #1





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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ę!

Ten post edytował rzymek01 26.05.2008, 15:15:03


--------------------
:]
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
JoShiMa
post
Post #2





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


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.

Ten post edytował JoShiMa 26.05.2008, 16:04:25


--------------------
Go to the top of the page
+Quote Post
nevt
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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)


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
rzymek01
post
Post #4





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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

Ten post edytował rzymek01 26.05.2008, 17:02:05


--------------------
:]
Go to the top of the page
+Quote Post
nevt
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


spróbuj np.:
  1. ... WHERE INSTR('1,3,4', c.id);


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
rzymek01
post
Post #6





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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

Ten post edytował rzymek01 26.05.2008, 20:43:35


--------------------
:]
Go to the top of the page
+Quote Post
nevt
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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...


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
rzymek01
post
Post #8





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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

Ten post edytował rzymek01 27.05.2008, 17:11:09


--------------------
:]
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 Aktualny czas: 22.08.2025 - 01:41