Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> SELECT z nietypowym warunkiem
zkwc
post
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 6.03.2013

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
wiiir
post
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

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


nie wiem czy ktos skuma o co ci chodzi, ja wymiękam (IMG:style_emoticons/default/tiredsmiley.gif)
Go to the top of the page
+Quote Post
bpskiba
post
Post #3





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


podpowiem:
ifnul()
if()

http://dev.mysql.com/doc/refman/5.0/en/con...function_ifnull
http://dev.mysql.com/doc/refman/5.0/en/con...tml#function_if

Go to the top of the page
+Quote Post
lexis72
post
Post #4





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.02.2013

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


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
Go to the top of the page
+Quote Post
bpskiba
post
Post #5





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


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 ...


Ten post edytował bpskiba 9.03.2013, 18:30:18
Go to the top of the page
+Quote Post
lexis72
post
Post #6





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.02.2013

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


  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?


Ten post edytował lexis72 9.03.2013, 19:37:41
Go to the top of the page
+Quote Post
sazian
post
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


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)
Go to the top of the page
+Quote Post
lexis72
post
Post #8





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.02.2013

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


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 ;/

Ten post edytował lexis72 10.03.2013, 23:23:52
Go to the top of the page
+Quote Post
bpskiba
post
Post #9





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


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
Go to the top of the page
+Quote Post
lexis72
post
Post #10





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.02.2013

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


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?
Go to the top of the page
+Quote Post
sazian
post
Post #11





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


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


Go to the top of the page
+Quote Post
lexis72
post
Post #12





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.02.2013

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


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.
Go to the top of the page
+Quote Post
sazian
post
Post #13





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
bpskiba
post
Post #14





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


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()................................................................
....

Ten post edytował bpskiba 11.03.2013, 20:43:50
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.09.2025 - 23:54