select like
raker - 28-02-2006 13:11
select like
Witam Zakladamy ze mamy tabele users w ktorej jedno z pol to login. Czy da sie wybrac z tabeli wszystkie loginy ktore zawieraja np. 'test' w tym loginie ale na pierwszej pozycji bedzie wlasnie login 'test' a na nastepnych pozostale ktore zawieraja 'test' (czyli w pierwszej kolejnosci wyswietlamy tak jakbysmy wykonali 'SELECT * FROM users WHERE login = 'test' a pozniej 'SELECT * FROM users WHERE login LIKE '%test%' AND login != 'test';
Chodzi mi czy da sie te powyzsze zapytania wykonac jako jedno zapytanie?
Dzieki za pomoc
Pozdrawiam
Raker
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Jan Słupicki - 28-02-2006 13:12
> Witam > Zakladamy ze mamy tabele users w ktorej jedno z pol to login. > Czy da sie wybrac z tabeli wszystkie loginy ktore zawieraja np. 'test' w > tym > loginie ale na pierwszej pozycji bedzie wlasnie login 'test' a na > nastepnych > pozostale ktore zawieraja 'test' (czyli w pierwszej kolejnosci wyswietlamy > tak > jakbysmy wykonali 'SELECT * FROM users WHERE login = 'test' a pozniej > 'SELECT * > FROM users WHERE login LIKE '%test%' AND login != 'test'; > > Chodzi mi czy da sie te powyzsze zapytania wykonac jako jedno zapytanie?
Możesz zrobić tak SELECT * FROM users WHERE login = 'test' UNION ALL SELECT * FROM users WHERE login LIKE '%test%' AND login != 'test'
-- Jan Słupicki
Przemyslaw Popielarski - 28-02-2006 13:12
Jan Słupicki <j.slupicki@provider.pl> wrote: > Możesz zrobić tak > SELECT * FROM users WHERE login = 'test' > UNION ALL > SELECT * FROM users WHERE login LIKE '%test%' AND login != 'test'
Nie gwarantuje to w zadnym wypadku, ze dostaniesz dane w w.w. kolejnosci. Bo kolejnosc nie powinna miec *zadnego* znaczenia jesli nie uzyles ORDER. Jesli ma znaczenie, to ktos nie pomyslal i zle zaprojektowal -- lub dopiero probuje to zle zrobic -- baze.
Zeby nie bylo zbyt prosto, to oczywiscie pytajacy nie podal nazwy oprogramowania, ktorego dotyczy pytanie, ale przytocze kawalek dokumentacji z MySQL, gdzie jest potwierdzenie moich w.w. slow.
http://dev.mysql.com/doc/refman/5.0/en/union.html
I prawidlowe rozwiazanie: "To cause rows in a UNION result to consist of the sets of rows retrieved by each SELECT one after the other, select an additional column in each SELECT to use as a sort column and add an ORDER BY following the last SELECT."
-- ../ premax ../ premax@hot,pl ../ koniec i bomba, a kto czytal ten traba. w.g.
Jan Słupicki - 28-02-2006 13:12
>> Możesz zrobić tak >> SELECT * FROM users WHERE login = 'test' >> UNION ALL >> SELECT * FROM users WHERE login LIKE '%test%' AND login != 'test' > > Nie gwarantuje to w zadnym wypadku, ze dostaniesz dane w w.w. kolejnosci. > Bo
Rzeczywiście - oparłem się na doświadczeniu a nie na dokumentacji. Sorry. W Oraclu działa to tak jak można oczekiwać ale właśnie sprawdziłem w DB2 i tu jest odwrotnie - najpierw idą wyniki z drugiego zapytania. Ciekawe :-)
> kolejnosc nie powinna miec *zadnego* znaczenia jesli nie uzyles ORDER. > Jesli ma znaczenie, to ktos nie pomyslal i zle zaprojektowal -- lub > dopiero probuje to zle zrobic -- baze. > > Zeby nie bylo zbyt prosto, to oczywiscie pytajacy nie podal nazwy > oprogramowania, ktorego dotyczy pytanie, ale przytocze kawalek > dokumentacji z MySQL, gdzie jest potwierdzenie moich w.w. slow. > > http://dev.mysql.com/doc/refman/5.0/en/union.html > > I prawidlowe rozwiazanie: > "To cause rows in a UNION result to consist of the sets of rows retrieved > by each SELECT one after the other, select an additional column in each > SELECT to use as a sort column and add an ORDER BY following the last > SELECT."
Zdaje się że poza MySQL nie można zrobić takiej konstrukcji z ORDER BY po ostatnim zapytaniu. Można by jednak zrobić coś w stylu:
SELECT * FROM ( SELECT *, 1 ord FROM users WHERE login = 'test' UNION ALL SELECT *, 2 ord FROM users WHERE login LIKE '%test%' AND login != 'test' ) temp ORDER BY ord
Czyli podzapytanie i pseudokolumna do oznaczenia kolejności - powinno być dość przenośne.
-- Jan Słupicki
Sebastian - 28-02-2006 13:12
Użytkownik "raker" <rakerWYTNIJTO@poczta.onet.pl> napisał w wiadomości news:0aa0.00000121.43ff089a@newsgate.onet.pl... > Witam > Zakladamy ze mamy tabele users w ktorej jedno z pol to login. > Czy da sie wybrac z tabeli wszystkie loginy ktore zawieraja np. 'test' w > tym > loginie ale na pierwszej pozycji bedzie wlasnie login 'test' a na > nastepnych > pozostale ktore zawieraja 'test' (czyli w pierwszej kolejnosci wyswietlamy > tak > jakbysmy wykonali 'SELECT * FROM users WHERE login = 'test' a pozniej > 'SELECT * > FROM users WHERE login LIKE '%test%' AND login != 'test'; > > Chodzi mi czy da sie te powyzsze zapytania wykonac jako jedno zapytanie? >
Mozesz sprobowac cos takiego
SELECT *, (CASE WHEN login = 'test' THEN 1 ELSE (CASE WHEN login LIKE '%test%' THEN 2 ELSE 3 END) END) as kolejnosc FROM users ORDER BY kolejnnosc
Sebastian
Jan Słupicki - 28-02-2006 13:12
> Mozesz sprobowac cos takiego > > SELECT *, (CASE WHEN login = 'test' THEN 1 ELSE (CASE WHEN login LIKE > '%test%' THEN 2 ELSE 3 END) END) as kolejnosc > FROM users > ORDER BY kolejnnosc
To zapytanie nie jest poprawne bo zwróci wszystkie wiersze z tabeli 'users'. Trzebaby je zmodyfikować: SELECT *, (CASE WHEN login = 'test' THEN 1 WHEN login LIKE '%test%' THEN 2 END) as kolejnosc FROM users WHERE login LIKE '%test%' ORDER BY kolejnosc
albo do twojego oryginalnego zapytania dodać HAVING kolejnosc < 3.
-- Jan Słupicki
Sebastian - 28-02-2006 13:12
Użytkownik "Jan Słupicki" <j.slupicki@provider.pl> napisał w wiadomości news:dts0hb$hpl$1@atena.e-wro.net... >> Mozesz sprobowac cos takiego >> >> SELECT *, (CASE WHEN login = 'test' THEN 1 ELSE (CASE WHEN login LIKE >> '%test%' THEN 2 ELSE 3 END) END) as kolejnosc >> FROM users >> ORDER BY kolejnnosc > > > To zapytanie nie jest poprawne bo zwróci wszystkie wiersze z tabeli > 'users'. > Trzebaby je zmodyfikować: > SELECT *, (CASE WHEN login = 'test' THEN 1 > WHEN login LIKE '%test%' THEN 2 > END) as kolejnosc > FROM users > WHERE login LIKE '%test%' > ORDER BY kolejnosc > > albo do twojego oryginalnego zapytania dodać HAVING kolejnosc < 3.
Swieta racja. Zle doczytalem pytanie.
Sebastian
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[help] Illustrator CS - =?ISO-8859-2?Q?znikn=B1=B3_Selection_?==?ISO-8859-2?Q?Tool_=28V=29?=
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
SELECT MAX(nazwaPola) FROM tabela WHERE .... i ORA-01405: pobran? warto?ci? kolumny jest NULL
=?iso-8859-2?q?select_sum_i_dwie_tabele..._b=B3=EAdna_agregac ja?=
=?iso-8859-2?Q?=5BMySql=5D_-_select_po_5_rekordow_mniejssych_i_wi=EAkszych?=
=?iso-8859-2?Q?=5BMySql=5D_Select_wed=B3ug_nazwy_pola?=
=?ISO-8859-2?Q?[mysql]_Nie_potrafi=EA_zgrupowa=E6_selecta_(proste)?=
=?ISO-8859-2?Q?[MS_SQL]_update_wielu_p=F3l_na_raz_z_selecta?=
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
[pgsql] jak =?ISO-8859-2?Q?zrobi=E6_taki_select_=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plfelgiuzywane.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|