Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Problem z zapytaniem, Zbyt wiele AND, OR ???
-uniejów-
post 5.12.2012, 11:01:52
Post #1





Goście







Witam.
Mam mały problem z poprawnym wyświetleniem rekordów. Nie wiem, być może chodzi o to, że jest tego "za dużo", ale po prostu jest tak, że nie chcę wyświetlać niektórych tytułów oraz "podtytułów", a reszta jak najbardziej ma się pojawiać.

W tabeli mam więc (m.in.) pola:
cat - kategoria; jest ich w sumie 5, ale chcę wyświetlać tylko z kategorii 2; tu mała uwaga - czasem pojawiają się (nie wiem czemu) rekordy z cat='1' a zapis w zapytaniu WHERE cat = '2' AND cat !='1' (...) nie działa...
title - tytuł arta
titlea - "podtytuł"


  1. $zap_e = "SELECT * FROM euro WHERE cat='2' AND status=0 AND title != 'Unie%' AND title != 'Mater%' AND title != 'Pozosta%' AND titlea != '%dopłat%' AND titlea LIKE 'Odc.%' OR titlea LIKE '%państw%' OR titlea LIKE '%flag%' OR titlea LIKE '%hymn%' ORDER BY RAND() LIMIT 5 ";

Co mam w tym zapytaniu źle, że wyświetla tak, jak nie powinno?
Bardzo proszę o pomoc.
Go to the top of the page
+Quote Post
nospor
post 5.12.2012, 11:08:28
Post #2





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




1) Jeśli używasz % to masz używać LIKE/NOT LIKE a nie =/!=
2) Z OR oraz AND jest dokładnie tak samo jak w matematyce z + oraz *

2+2*3 da zupełnie inny wynik niż (2+2)*3

W zapytaniu również w zależności od tego co chcesz osiągnąć musisz używać nawiasów by mówić co jest ważniejsze od czego.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-uniejów-
post 5.12.2012, 17:52:13
Post #3





Goście







Próbuję, ale nic z tego nie wychodzi.
Obecny kod:
  1. $zap_euro = "SELECT * FROM euro WHERE cat='2' AND status=0 AND title NOT LIKE 'Unie%' AND title NOT LIKE 'Mater%' AND title NOT LIKE 'Pozosta%' AND titlea NOT LIKE '%dopłat%' AND titlea NOT LIKE 'Odc.%' AND titlea LIKE '%państw%' OR titlea LIKE '%flag%' OR titlea LIKE '%hymn%' ORDER BY RAND() LIMIT 5 ";

Daje te same rezultaty - czyli te same (nazwijmy to) "nieoczekiwane" wyniki.
Nie wiem, o co chodzi z porównaniem z matematyką. Fakt faktem:
2+2*3 da nam 8
ale już
(2+2)*3 da nam 12
Ale za bardzo nie wiem, jak mam tę matmę "przetłumaczyć" na zapytanie (bo chyba o to chodzi).

Zapytanie powinno brzmieć:
POKAŻ:
- wszystko TYLKO z kategorii 2 (czyli cat='2')
- tytuły niezawierające w sobie fraz: "Unie", "Mater", "Pozosta"
- podtytuły niezawierające w sobie fraz: "dopłat", "Odc."
- podtytuły zawierające w sobie frazy: "państw", "flag", "hymn"

Chyba, że coś źle rozumiem sad.gif
Go to the top of the page
+Quote Post
nospor
post 5.12.2012, 17:55:43
Post #4





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




+ to OR
* to AND
Prosta logika... Bez nawiasów najpierw wykonuje się *AND a dopiero potem +OR

  1. $zap_euro = "SELECT * FROM euro WHERE cat='2' AND status=0 AND title NOT LIKE 'Unie%' AND title NOT LIKE 'Mater%' AND title NOT LIKE 'Pozosta%' AND titlea NOT LIKE '%dopłat%' AND titlea NOT LIKE 'Odc.%' AND titlea LIKE '%państw%' and (titlea LIKE '%flag%' OR titlea LIKE '%hymn%') ORDER BY RAND() LIMIT 5 ";

Choć nadal nie wiem czy dobrze zrozumiałem to czego ma szukać. Nie mniej jednak w kodzie powyżej pokazałem ci o co chodzi z nawiasami. Może teraz będzie ci łatwiej.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-uniejów-
post 5.12.2012, 18:27:28
Post #5





Goście







Uuuu... teraz nic nie pokazuje - w miejscu, gdzie mają się wyświetlać wyniki jest "biało" :|
Go to the top of the page
+Quote Post
nospor
post 5.12.2012, 18:30:45
Post #6





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Bo nie ma rekordów spełniających te warunki.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-uniejów-
post 5.12.2012, 18:36:46
Post #7





Goście







Sprawdzięłm to na wyszukiwarce: rekorsy takie są.
Postanowiłem usunąć wszystkie title NOT LIKE - dalej to samo (czyli biało)
Usunąłem to, co w nawiasie i... ok - wyświetla, tyle, że tylko rekordy zawierające w "podtytule" państw. A jeszcze powinno pokazać "flag" oraz "hymn".

Kurcze - myślałem, że potrafię pisać zapytania... wink.gif
Go to the top of the page
+Quote Post
d3ut3r
post 5.12.2012, 20:06:29
Post #8





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


Cytat
- wszystko TYLKO z kategorii 2 (czyli cat='2')
- tytuły niezawierające w sobie fraz: "Unie", "Mater", "Pozosta"
- podtytuły niezawierające w sobie fraz: "dopłat", "Odc."
- podtytuły zawierające w sobie frazy: "państw", "flag", "hymn"


  1.  
  2. SELECT * FROM euro WHERE cat=2
  3. AND title NOT LIKE '%Unie%'
  4. AND title NOT LIKE '%Mater%'
  5. AND title NOT LIKE '%Pozosta%'
  6. AND titlea NOT LIKE '%dopłat%'
  7. AND titlea NOT LIKE '%Odc.%'
  8. AND (titlea LIKE '%państw%' OR titlea LIKE '%flag%' OR titlea LIKE '%hymn%')
  9.  


Powinno działać. LIKE '%tekst%' ewentualnie można zamienić na LIKE 'tekst%' wówczas zostaną wykluczone lub dobrane rekordy zaczynające się od 'tekst'.

Ten post edytował d3ut3r 5.12.2012, 20:07:09


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
-uniejów-
post 5.12.2012, 20:42:33
Post #9





Goście







d3ut3r - dziękuję BARDZO! smile.gif
Działa idealnie smile.gif

nospor - dzięki za wyjaśnienia -> przydadzą się na przyszłość smile.gif

Pozdrawiam!
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 Wersja Lo-Fi Aktualny czas: 25.04.2024 - 21:35