Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dwa warunki tego samego pola
Forum PHP.pl > Forum > Bazy danych > MySQL
maciu
mam takie zapytanie do sql
  1. SELECT cms_page.id, cms_page.mtime FROM cms_page, cms_page_sections_assign WHERE cms_page.id=cms_page_sections_assign.pid AND cms_page_sections_assign.sid =6 AND cms_page_sections_assign.sid !=7 AND (
  2. cms_page.template_dir = "'.$url_szablonu['pop'].'" OR cms_page.template_dir = "'.$url_szablonu['rock'].'" OR cms_page.template_dir = "'.$url_szablonu['hiphop'].'" OR cms_page.template_dir = "'.$url_szablonu['techno'].'" OR cms_page.template_dir = "'.$url_szablonu['klasyka'].'"
  3. )
  4. ORDER BY id DESC LIMIT 8


Moje wątpliwości budzi kod
  1. cms_page_sections_assign.sid =6 AND cms_page_sections_assign.sid !=7

Czy mysql obsługuje w jednym zapytaniu dwa warunki do tego samego pola?
W tym zapytaniu nie sprawdza mi warunku cms_page_sections_assign.sid !=7.
Macie jakiś pomysł jak to zrobić, aby ten warunek również był brany pod uwage przy wyborze odpowiednich rekordów?
scanner
Cytat(maciu @ 2004-07-19 14:35:19)
Moje wątpliwości budzi kod
  1. cms_page_sections_assign.sid =6 AND cms_page_sections_assign.sid !=7

Moje wątpliwosci też budzi.

"Jest równe 6 i nierówne 7" ? co chcesz osiągnąć?
maciu
w tabeli cms_page_sections_assign może być kilka rekordów dotyczących tej samem strony(rozróznianego za pomocą innego pola w tabeli), i wtedy może mieć pole sid równocześnie wartość 6 i 7
kszychu
No dobra, ale zapis x = 6 AND x != 7 sprowadza się do zapisu x = 6!
maciu
problem polega na tym, że wartości 6 i 7 są w osobnych rekordach i czy mysql potrafi to sprawdzić w jednym ruchu
kszychu
Potrafi znależć rekordy, gdzie sid będzie równy 6 lub 7, albo będzie różny od 6 i różny od 7. Powiedz może jakie rekordy cię interesują, i wtedy ułoży sięodpowiednie zapytanie.
To o co pytasz jest możliwe, ale Twój warunek nie ma sensu.
maciu
wyjaśnię to dokładniej
tabela cms_page_sections_assign składa się z pół id, pid(id z cms_page), sid
czyli mamy np, takie rekordy w tej tabeli:
id pid sid
4 23 6
6 23 7
7 25 4
8 24 6

chodzi o to, żeby zapytanie zwróciło te PID, które posiadają wartość 6 i nie posiadają wartości 7. W tym przypadku zwróci PID 24
kszychu
Eeeeee, to trza było od razu, że mieszasz sid z id! Bo z przykładu domyśliłem się, że tak właśnie jest. Oto fragment zapytania:
  1. WHERE (id = 6 OR sid = 6) AND id != 7 AND sid != 7
maciu
Kszychu nie zrozumiałeś. Pole id jest tylko polem porządkowym, jego wartość nie ma żadnego znaczenia w tym przypadku. Chodzi o to, aby znalazł te numery PID, które mają wartość 6 i jednocześnie nie mają wartości 7. Czyli w tym przykładzie, który podałem zwróci PID=24
mtr
maciu:
Chyba Ty coś namieszałeś winksmiley.jpg .
Skoro id nie ma żadnego znaczenia, to w twoim przykładzie takze pierwsza krotka ma wartość 6, i zwroci PID=23.
Czyli jak na moj gust :

  1. SELECT cms_page.id, cms_page.mtime FROM cms_page, cms_page_sections_assign WHERE cms_page.id=cms_page_sections_assign.pid AND cms_page_sections_assign.sid =6


Jesli to jednak nie to, to sproboj jeszcze jaśniej wyjaśnić pytanie smile.gif

pozdrawiam
maciu
podam jeszcze raz przykład, tym razem bez id bo starsznie Wam to miesza

tabela cms_page_sections_assign
PID SID
24 6
24 7
22 6
30 7
31 6

pole PID jest równe: cms_page.id=cms_page_sections_assign.pid
SID przyjmuje wartość od 1 do 7
Wartość pola PID może się powtarzać, ponieważ strona (prowadzi do niej indeks PID) może mieć przypisane kilka różnych wartości SID (jak w przykładzie PID=24 ma przypisane dwie wartości SID 6 i 7)

I teraz potrzebuje, aby wybrał mi rekordy takie w których ten sam PID ma wartość 6, ale nie ma wartości 7, czyli coś takiego:
  1. cms_page_sections_assign.sid =6 AND cms_page_sections_assign.sid !=7

tylko, że sql sprawdza tylko ten pierwszy warunek.
scanner
Cholera człowieku.
Pomyśl logicznie.

Jeśli coś ma wartość 6 to ZAWSZE NIE MA wartości 7. Rozumiesz?

Plączesz się jak sznurek od tampaxa. Zalecam weekebdową przerwę od komputera.
kszychu
Spokojnie chłopaki, smile.gif))))
Ja zajarzyłem o co chodzi, ale niestety nie potrafię mu pomóc. Spróbuję wyjaśnić, może ktoś będzie wiedział.
Otóż są pola:
PID SID
24 6
24 7
22 6
30 7
31 6

No i ten nieszczęsny PID = 24 występuje dwa razy; raz jego SID jest równy 6, a poniżej, w drugim wpisie jest równy 7. I teraz chodzi o to, by wyłapać wszystkie numery PID, dla których numer SID jest równy 6, ale jako że może on przyjąć jeszcze inne wartości, to żadna z tych innych wartości ni może być równa 7. W tym przypadku, dla PID równego 24 SID wynoszą 6 i 7, więc drugi warunek jest niespełniony.
Tylko jak to opisać w SQLu, niestety nie wiem.

Pozdrawiam
maciu
kszychu dokładnie o to mi chodzi.

A ty scanner, jak nie potrafisz zrozumieć moich postów to na nie nie odpowiadaj, a nie będziesz się dąsał. Inni potrafią zrozumieć, więc to ja Tobie zalecam weekendowy odpoczynek od kompa.
Parti
Cytat(kszychu @ 2004-07-23 11:35:43)
Tylko jak to opisać w SQLu, niestety nie wiem.

Trzeba uzyc podzapytania.

  1. SELECT * FROM tab WHERE sid = 6 AND pid NOT IN (SELECT pid FROM tab WHERE sid = 7)


Cos takiego.

Nie sprawdzalem tego zapytania, bo nie mam w tym momencie dostepu do bazy mysql, ktora obslugiwala by podzapytania (ver 4.1.x zdaje sie)
maciu
czy da się to zrobić nie używając podzapytań, bo niestety mam starą wersję myslq'a?
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.