Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Warunek IF w zapytaniu
Forum PHP.pl > Forum > Bazy danych > MySQL
lukasamd
Witam,
czy da się uwarunkować jakoś zapytanie? Chcę wyciągnąć tabelę ostatnich postów z nieco egotycznego forum - mam tabelę z tematami z polami:

- first_post_id
- last_post_id

Niestety jeżeli nie było żadnej odpowiedzi to w last_post_id pojawia się 0 przez co nie mogę jej powiązać z innymi tabelami (od postów i od userów) no i temat jest opuszczany.

Czy dałoby się zrobić zapytanie o mniej- więcej takiej budowie:

  1. SELECT wartość1, wartość2, wartośćN, first_post_id IF(last_post_id == 0), wartośćN+1"


Chodzi o to, iż w wypadku gdy last_post_id jest równe 0, pobierana byłaby wartość first_post_id zaś w przeciwnym samo last_post_id

Da się?
Kicok
Da się: http://dev.mysql.com/doc/refman/4.1/en/con...tml#function_if
  1. IF( warunek, co_jeśli_prawda, co_jeśli_fałsz )
lukasamd
A jak to dokładniej wrzucić? Dodanie tego do mojego zapytania select:

  1. SELECT wartosci, IF( t.last_post_id=0, t.last_post_id=t.first_post_id, t.last_post_id ) reszta zapytania


Nie daje rezultatów - tzn. skrypt działa ale tak jakby nadal było 0. Chciałbym zrozumieć co w tym wypadku daje IF - czy jeżeli prawda to pobiera a a gdy fałsz b czy co innego...

EDIT:

Wrzucenie:

  1. SELECT wartosci, IF( t.last_post_id=0, t.last_post_id+1, t.last_post_id ) reszta zapytania


też nic nie daje choć w wypadku 0 powinno ustawić na 1.
Kicok
U mnie zapytanie:
  1. SELECT *, IF( last_post_id = 0, first_post_id, last_post_id ) AS last_post_id
  2. FROM tabela

działa prawidłowo. Na pewno w kolumnie last_post_id masz zera? Może jest tam NULL?
lukasamd
Wrzuciłem to co podałeś i sam warunek chyba działa, gdy jest fałsz to jest dobrze wybierane. Problem pojawia się gdy last_post_id = 0, powinno w last_post_id wrzucić wartość z first_post_id ale najwyraźniej tego nie robi bo tematów na liście nadal brakuje (tych bez odpowiedzi).

EDIT:
Wygląda to tak, jakby nie działało przypisanie przez AS, podam całe zapytanie jakie mam:
  1. SELECT p.ptime, p.poster_id, t.tid, t.topic, t.n_posts, t.n_views, IF(t.last_post_id = 0, t.first_post_id, t.last_post_id ) AS last_post_id, u.username
  2. FROM aef_topics t, aef_posts AS p, aef_users AS u
  3. WHERE last_post_id = p.pid AND p.poster_id = u.id
  4. ORDER BY ptime DESC LIMIT 5


Jak widać wartość uzyskiwana poprzez warunek jest stosowana także nieco dalej.


EDIT2:
Zrobiłem, powiązałem ze sobą numery id tematu w obu tabelach, potem pogrupowałem według tego pola:

  1. SELECT p.pid, p.ptime, p.poster_id, t.tid, t.topic, t.n_posts, t.n_views, u.username
  2. FROM aef_topics t, aef_posts AS p, aef_users AS u
  3. WHERE p.post_tid = t.tid AND p.poster_id = u.id
  4. GROUP BY tid
  5. ORDER BY pid DESC LIMIT 5


Działa tak jak należy smile.gif Mimo to dzięki za pomoc, IF może mi się jeszcze kiedyś przydać a teraz przynajmniej wiem jak je stosować.
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.