Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: IF w zapytaniu SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
szczypior
Witam
Piszę dość skomplikowane zapytanie, które ma pobrać 3 najnowsze wpisy z bazy "pytan i odpowiedzi".


Wygląda ono tak:
  1. SELECT zp.login, k.nazwa, p.temat, p.tresc, p.odp_ile, p.DATA, p.ocena FROM pytania p
  2. JOIN kategorie k ON (p.kat=k.id) JOIN users zp ON (zp.id=p.autor)
  3. WHERE IF (p.odp!=0, p.id=p.odp,p.id=p.id) AND p.spam='0' ORDER BY p.id DESC LIMIT 3


W przypadku gdy co najmniej jeden z 3 ostatnich wpisów w tabeli ma w kolumnie odp wartość inną niż 0 oznacza że jest odpowiedzią na wcześniejszy wpis (o id podanym właśnie w tej kolumnie wpisu z odpowiedzią), czyli nie chcę go wyświetlić tylko wpis zawierający pytanie na które ten odpowiada.

W tym celu w WHERE wpisałem IF'a ale efekt jego działanie nie jest taki jakiego oczekuje.

Będę bardzo wdzięczny za pomoc i wszelkie wskazówki.

nikt nie zna odpowiedzi na mój problem ? sad.gif

próbowałem jeszcze raz joinować tabele w ten sposób ale nadal nie jest to to czego oczekuję sad.gif

  1. ... JOIN users zp ON (zp.id=p.autor) JOIN pytania p1 ON IF (p.odp!=0, p.odp,p1.id)=p.id WHERE p.spam='0' ...


HELP! sadsmiley02.gif
najtje
jak możesz to podaj:
strukturę tabeli pytania
strukturę tabeli kategorie
strukturę tabeli users
oraz jakiś przykład tj. zakładając że mam takie a takie dane ( w tych tabelach) chciałbym wyświetlić takie i takie wiersze
Odpowiedź będziesz miał za 5 min.
szczypior
tabela pytania:
Kod
| id | kategoria | tytul | tresc | odp | autor |
| 1  | 128       | asd   | sada  | 0   |    1
| 2  | 45        | ard   | saaa  | 0   |    23
| 3  | 122       | awd   | sbbb  | 0   |   23
| 4  | 128       |  null | sccc  | 1   |   56  
| 5  | 124       | aw4   | sbb4  | 0   |   253
| 6  | 123       | null  | sccc  | 3   |   536


Gdy w odp jest 0 to oznacza że jest to pytanie, gdy inna liczba to znaczy ze jest to odpowiedz na pytanie o takim id

tabela kategorie:
Kod
| id | nazwa |
| 1  | rowery|


tabela users:
Kod
| id | login  | haslo   |
| 1  | czesio | maslana |


Chcę wyswietlić 3 najnowsze wpisy lub takie w ktorych jest nowa odpowiedz, tzn: Jeśli wśród 3 najnowszych wpisów w księdze jest wpis w którym odp jest różne od 0 to wtedy zamiast tego wpisu chce wyświetlić wpis będący pytaniem dla odpowiedzi w tym wpisie. Trochę skomplikowanie brzmi:)
Czyli zapytanie ma wyświetlić pytania o id 3,5,1.

Nikt mnie nie naprowadzi jak to można zrobić? sad.gif
najtje
zapytanie które ci zwróci to o co pytasz to:
  1. SELECT * FROM pytania JOIN (SELECT t1 .id AS l,coalesce(t2.id,t1.id) AS iid FROM pytania AS t1 LEFT JOIN pytania AS t2 ON t2.id=t1.odp ) AS q1 ON pytania.id=q1.iid ORDER BY l DESC LIMIT 3


teraz wystarczy zrobić joina (albo subquery na odpowiednich kolumnach ) z tabelami kategorii i userów jeśli chcesz żeby id'ki zamieniły się na nazwiska i nazwy kategorii.
szczypior
super! działa, wielkie dzięki smile.gif
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.