Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SELECT z nietypowym warunkiem
Forum PHP.pl > Forum > Bazy danych > MySQL
zkwc
Witam Wszystkich,
Poszukuję najprostszego rozwiązania do poniższego problemu:
Z poniższej tabeli potrzebuję pobrać rekordy dla wszystkich zamówień (ord) gdzie typ = 'wysylka' (gdy 'wysylka' nie występuje należy pobrać rekord dla 'billing')

lp ord typ miasto
1 1 billing wroclaw
2 2 billing krakow
3 3 billing warszawa
4 3 wysylka lodz
5 4 billing poznan
6 5 billing krakow
7 5 wysylka katowice

Tabela wyjściowa powinna wyglądać następująco:

lp ord typ miasto
1 1 billing wroclaw
2 2 billing krakow
4 3 wysylka lodz
5 4 billing poznan
7 5 wysylka katowice

Z góry dzięki.
Pozdrawiam,
zkwc
wiiir
nie wiem czy ktos skuma o co ci chodzi, ja wymiękam tiredsmiley.gif
lexis72
bpskiba czy moge tego uzyc zeby pobieralo wynik z wybranymi kryteriami a gdy nie bedzie takiego wyniku w bazie zwroci jakis wymyslony przeze mnie tekst np 'Brak'?

Mam taki kod Select i chcialbym zeby w przypadku braku wyniku spelniajacego te kryteria pojawial sie tekst 'brak' , jak moge to zrobic uzywajac te IFNULL

(SELECT user_name FROM ".DB_WYNIKI." LEFT JOIN ".DB_USERS." USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc
bpskiba
Cytat(lexis72 @ 9.03.2013, 15:57:21 ) *
bpskiba czy moge tego uzyc zeby pobieralo wynik z wybranymi kryteriami a gdy nie bedzie takiego wyniku w bazie zwroci jakis wymyslony przeze mnie tekst np 'Brak'?

Mam taki kod Select i chcialbym zeby w przypadku braku wyniku spelniajacego te kryteria pojawial sie tekst 'brak' , jak moge to zrobic uzywajac te IFNULL

(SELECT user_name FROM ".DB_WYNIKI." LEFT JOIN ".DB_USERS." USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc


TAK
  1. SELECT w.user_name,IFNULL(u.user_id,'brak')
  2. FROM DB_WYNIKI w
  3. LEFT JOIN DB_USERS u USING(user_id)
  4. WHERE ...
lexis72
  1. (SELECT w.user_name,IFNULL(u.user_id,'brak') FROM ".DB_WYNIKI." w LEFT JOIN ".DB_USERS." u USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc


Zrobilem tak i nie dziala, wyskakuje blad Unknown column 'w.user_name' in 'field list'

Inne zapytanie zrobione w ten sposob tez nie dziala: "Operand should contain 1 column(s)"

  1. (SELECT wynik, IFNULL(wynik,'brak') FROM ".DB_WYNIKI." WHERE warunek=1 AND grupa_id=t1.grupa_id) AS zxc


natomiast jesli zrobie to w ten sposob nie wywala bledow ale tez nie zwraca tekstu 'brak' tylko nic sie nie pojawia.

  1. (SELECT IFNULL(wynik,'brak') FROM ".DB_WYNIKI." WHERE warunek=1 AND grupa_id=t1.grupa_id) AS zxc


Pomoze ktos?
sazian
pokarz pełne zapytania a nie wycinki

pierwszy błąd mówi że nieznana jest kolumna w.user_name
natomiast drugiego zapewne używasz jako podzapytania w klauzuli SELECT, a w niej podzapytanie może zwracać tylko jedną kolumnę(a są dwie)
lexis72
Ok bo faktycznie user_name nie ma w bazie wyniki tylko jest user_id a user_name jest w bazie users. Poprawilem zatem zapytanie bpskiby na:

  1. (SELECT w.user_name,IFNULL(u.user_id,'brak') FROM ".DB_WYNIKI." u LEFT JOIN ".DB_USERS." w USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc


I tez wyskakuje
"Operand should contain 1 column(s)"

Sazian co robie zle skoro te zapytanie moze zwracac tylko 1 wynik, przy tych kryteriach nie moze byc w bazie wiecej wynikow. Wiec albo ten wynik jest wtedy powinno go wyswietlic albo go nie ma wiec wtedy chcialbym zeby wyswietlalo jakis zamienny tekst. Nie rozumiem jakie sa 2 kolumny? W tabelii kolumn jest wiele ale te zapytanie tyczy sie tylko jednej....

Tutaj musi byc cos nie tak z zapytaniem bo nawet jesli robie zapytanie dotyczace jednej kolumny to jakie where bym nie podal zawsze wyskakuje ten sam blad. Np podaje kryterium dla id wyniku=20 gdzie jest takie w bazie i powinno go wyswietlic to i tak wyskakuje blad. Podaje wynik_id=100 gdzie nie ma takiego wyniku i powinno wyswietlic zamienny tekst to tez ten sam blad...

  1. (SELECT wynik, IFNULL(wynik,'brak') FROM ".DB_WYNIKI." WHERE wynik_id=20) AS zxc




Jak dla mnie poprawnie zrobione jest te zapytanie:
  1. (SELECT IFNULL(wynik,'brak') FROM ".DB_WYNIKI." WHERE warunek=1 AND grupa_id=t1.grupa_id) AS zxc


Tylko ze ono zachowuje sie jak zwykle zapytanie bez IFNULL czyli jesli wynik o podanych kryteriach znajduje sie w bazie to go zwraca a jesli nie ma takiego rekordu w bazie to nic nie wyswietla a chce zeby wyswietlalo tekst BRAK ;/
bpskiba
Cytat(lexis72 @ 10.03.2013, 23:05:30 ) *
Ok bo faktycznie user_name nie ma w bazie wyniki tylko jest user_id a user_name jest w bazie users. Poprawilem zatem zapytanie bpskiby na:

  1. (SELECT w.user_name,IFNULL(u.user_id,'brak') FROM ".DB_WYNIKI." u LEFT JOIN ".DB_USERS." w USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc


1. Wygląda na to, że to dalej nie jest kompletne zapytanie. Świadczy o tym np odwołanie się do t1.grupa_id i brak komunikatu o nieznanej tabeli t1
2. funkcja ifnull() ma sens tylko na polach, które mogą mieć wartość null, a wątpię aby user_id gdzieś było nulem
lexis72
Sprawdzilem to na innym zapytaniu w innej bazie i wyszlo mi ze to dziala to tylko w przypadku kiedy poszukiwany rekord ma wstawiona wartosc null. Natomiast mi chodzilo o to ze rekord jest pusty (nie ma nic wpisane) albo w ogole go nie ma. Jak zrobic zapytaniem mysql by wtedy pokazywalo zamienny tekst?

To jest przykladowa moja baza danych:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <meta content="text/html; charset=ISO-8859-2"
  3. http-equiv="content-type">
  4. </head>
  5. <table style="text-align: left; width: 665px; height: 172px;"
  6. border="1" cellpadding="2" cellspacing="2">
  7. <tr>
  8. <td>User_id</td>
  9. <td>Warunek</td>
  10. <td>Grupa</td>
  11. </tr>
  12. <tr>
  13. <td>5</td>
  14. <td>1</td>
  15. <td>1</td>
  16. </tr>
  17. <tr>
  18. <td>8</td>
  19. <td>2</td>
  20. <td>2</td>
  21. </tr>
  22. <tr>
  23. <td>9</td>
  24. <td>2</td>
  25. <td>3</td>
  26. </tr>
  27. <tr>
  28. <td>10</td>
  29. <td>1</td>
  30. <td>4</td>
  31. </tr>
  32. <tr>
  33. <td>12</td>
  34. <td>2</td>
  35. <td>5</td>
  36. </tr>
  37. </tbody>
  38. <br>
  39. </body>
  40. </html>


Mam nastepujace zapytanie

  1. (SELECT user_name FROM ".DB_WYNIKI." LEFT JOIN ".DB_USERS." USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc


Wybiera mi ono tylko wierwsze z warunkiem 1 i grupą ustalona wczesniej. Jesli ustalona grupa to np 5 to wskazuje mi uzytkownika o ID 12. Wszystko dziala jak nalezy. Problem jest taki ze gdy ustalona jest grupa 6 a jak widac w zalaczonej tabeli jeszcze nie ma uzytkownika ktory by nalezal do tej grupy pojawia sie puste pole a chcialbym zeby pokazywal sie wymyslony przeze mnie tekst zamienny. Czy MYSQL na prawde nie ma takiej funkcji zeby podawal zamienny tekst w przypadku gdy nie znajdzie poszukiwanego rekordu?
sazian
Cytat(lexis72 @ 10.03.2013, 23:05:30 ) *
  1. (SELECT w.user_name,IFNULL(u.user_id,'brak') FROM ".DB_WYNIKI." u LEFT JOIN ".DB_USERS." w USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc



Sazian co robie zle skoro te zapytanie moze zwracac tylko 1 wynik, przy tych kryteriach nie moze byc w bazie wiecej wynikow. Wiec albo ten wynik jest wtedy powinno go wyswietlic albo go nie ma wiec wtedy chcialbym zeby wyswietlalo jakis zamienny tekst. Nie rozumiem jakie sa 2 kolumny? W tabelii kolumn jest wiele ale te zapytanie tyczy sie tylko jednej....


w.user_name to pierwsza kolumna, a ,IFNULL(u.user_id,'brak') to druga kolumna
podzapytanie użyte w SELECT musi zwracać wartość czyli jedną kolumnę i jeden wiersz



tak na szybko
  1. SELECT user_name,ifnull(groupName,'brak') groupName
  2. FROM users u
  3. LEFT JOIN groups g ON g.groupId=u.groupId

czyli jeśli niema odpowiedniego rekordu w "groups" wyświetli 'brak', a jeśli jest to wyświetli nazwę grupy


lexis72
Ok juz wiem o co chodzi z tymi 2 kolumnami ale to ciagle nie dziala.... Poprawne zapytanie powinno zatem wygladac tak :

  1. (SELECT IFNULL(user_name,'brak') FROM ".DB_WYNIKI." LEFT JOIN ".DB_USERS." USING(user_id) WHERE warunek=1 AND grupa_id=t1.grupa_id) AS abc


Nie wywala juz zadnego bledu ale nie zwraca tez tekstu 'brak' gdy nie znajdzie wyniku. Po prostu te zapytanie zwroci 'brak' tylko w przypadku kiedy ten rekord bedzie mial wartosc NULL a nie w przypadku kiedy bedzie PUSTY lub gdy w ogole takiego rekordu NIE BEDZIE w bazie.

A w mojej bazie nie uzywam nulli po prostu jak czegos nie ma to komorka pozostaje pusta.. I chodzi mi o to ze jak jest pusta to zeby zwracal tekst albo jak nie ma rekordu spelniajacego te kryteria to zeby wyswietlalo ten tekst.
sazian
po pierwsze to że nie używasz nuli jest nieistotne

załóżmy że masz takie tabele

users:
userId|userName|groupId
1|user_1 |1
2|user_2 |5
3|user_10 |9

oraz tabela z grupami
groups:
groupId|groupName
1|pierwsza grupa


to zapytanie
  1. SELECT user_name, groupName
  2. FROM users u
  3. LEFT JOIN groups g ON g.groupId=u.groupId


da w wyniku
user_1|pierwsza grupa
user_2| NULL
user_10| NULL



jak widzę twoje zapytanie dalej jest bardo tajemnicze i pokazujesz tylko pod zapytanie wink.gif
  1. IFNULL((SELECT user_name FROM ".DB_USERS." WHERE warunek=1 AND grupa_id=t1.grupa_id),'brak') AS abc


coś więcej naprawdę jest ciężko powiedzieć nie znając struktury bazy i zapytania głównego
bpskiba
może warto to odwrócić

  1. SELECT ...
  2. FROM users u
  3. JOIN groups g USING(groupId)
  4. LEFT JOIN wiadomoci w USING(user_id)
  5. WHERE
  6. ...


Użytkownik zapewne istnieje, zapewne jest też w jakiejś grupie.... a być może ma jakieś wiadomości

Swoją drogą tak się zastanawiam, czy pytającemu nie chodzi o mysql_num_rows()................................................................
....
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.