Pomysł na przejrzyste zapytanie?
Pawel - 10-08-2007 00:00
Pomysł na przejrzyste zapytanie?
Witam Proszę o pomoc (wskazówkę) jak zbudować przejrzyste zapytanie do mysqla.
tabela z danymi id_tab id mod 1 1 50 2 1 100 3 1 70 4 2 300 5 2 100 6 3 70
jak wybrać wszystkie id dla mod=100 i mod=70, czyli jedno id (np. 1) musi mieć przypisane obie wartości mod (50 i 100)?
Oczywiście istnieje możliwość odwoływania się przez INNER JOIN do tej samej tabeli i zapytanie wyglądało by mniej więcej tak:
SELECT * FROM tab2 t2 INNER JOIN tab2 t1 ON t2.id = t1.id WHERE t1.`mod` =70 AND t2.`mod` =100
ale może ktoś ma inny pomysł na rozwiązanie tego problemu?
Pozdrawiam Pawel
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Rafal Franczak - 10-08-2007 00:00
Pawel napisał(a): > Witam > Proszę o pomoc (wskazówkę) jak zbudować przejrzyste zapytanie do mysqla. > > tabela z danymi > id_tab id mod > 1 1 50 > 2 1 100 > 3 1 70 > 4 2 300 > 5 2 100 > 6 3 70 > > > jak wybrać wszystkie id dla mod=100 i mod=70, czyli jedno id (np. 1) musi mieć > przypisane obie wartości mod (50 i 100)? > > Oczywiście istnieje możliwość odwoływania się przez INNER JOIN do tej samej > tabeli i zapytanie wyglądało by mniej więcej tak: > > SELECT * > FROM tab2 t2 > INNER JOIN tab2 t1 ON t2.id = t1.id > WHERE t1.`mod` =70 > AND t2.`mod` =100 > > ale może ktoś ma inny pomysł na rozwiązanie tego problemu? > > Pozdrawiam > Pawel > >
Jeżeli para (id,mod) dla mod in (100,70) nie będzie unikalna to możesz dostać więcej niż jeden wiersz. Chyba że ci to nie przeszkadza.
Rafał
hubert depesz lubaczewski - 10-08-2007 00:00
Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: > tabela z danymi > id_tab id mod > 1 1 50 > 2 1 100 > 3 1 70 > 4 2 300 > 5 2 100 > 6 3 70 > ale może ktoś ma inny pomysł na rozwiązanie tego problemu?
czy kombinacja (id,mod) jest unikatowa? jak tak to: select id from table where mod in (70,100) group by id having count(*) = 2;
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
puchkub@poczta.onet.pl - 10-08-2007 00:00
> Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: > > tabela z danymi > > id_tab id mod > > 1 1 50 > > 2 1 100 > > 3 1 70 > > 4 2 300 > > 5 2 100 > > 6 3 70 > > ale może ktoś ma inny pomysł na rozwiązanie tego problemu? > > czy kombinacja (id,mod) jest unikatowa? > jak tak to: > select id from table where mod in (70,100) group by id having count(*) = 2; > > depesz
niestety nie jest unikatowa :-( są jeszcze jakieś propozycje?
Pozdrawiam Pawel
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Adamm - 10-08-2007 00:00
Użytkownik <puchkub@poczta.onet.pl> napisał w wiadomości news:374c.00000129.46bb66b3@newsgate.onet.pl... >> czy kombinacja (id,mod) jest unikatowa? >> jak tak to: >> select id from table where mod in (70,100) group by id having count(*) = >> 2; >> >> depesz > > > niestety nie jest unikatowa :-( > są jeszcze jakieś propozycje? >
Rozwiń tylko wyżej podany pomysł
select id from (select distinct t.id , t.mod table t) where mod in (70,100) group by id having count(*) = 2;
Pozdrawiam Adam
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 10-08-2007 00:00
puchkub@poczta.onet.pl wrote: >> Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: >>> tabela z danymi >>> id_tab id mod >>> 1 1 50 >>> 2 1 100 >>> 3 1 70 >>> 4 2 300 >>> 5 2 100 >>> 6 3 70 >>> ale może ktoś ma inny pomysł na rozwiązanie tego problemu? >> czy kombinacja (id,mod) jest unikatowa? >> jak tak to: >> select id from table where mod in (70,100) group by id having count(*) = 2; >> >> depesz > > > niestety nie jest unikatowa :-( > są jeszcze jakieś propozycje?
Chyba to powinno zadziałać: count(distinct mod)
-- P.M.
Rafal Franczak - 10-08-2007 00:00
puchkub@poczta.onet.pl napisał(a): >> Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: > Witam > Proszę o pomoc (wskazówkę) jak zbudować przejrzyste zapytanie do mysqla. > > tabela z danymi > id_tab id mod > 1 1 50 > 2 1 100 > 3 1 70 > 4 2 300 > 5 2 100 > 6 3 70 > > > jak wybrać wszystkie id dla mod=100 i mod=70, czyli jedno id (np. 1) musi mieć > przypisane obie wartości mod (50 i 100)? > > Oczywiście istnieje możliwość odwoływania się przez INNER JOIN do tej samej > tabeli i zapytanie wyglądało by mniej więcej tak: > > SELECT * > FROM tab2 t2 > INNER JOIN tab2 t1 ON t2.id = t1.id > WHERE t1.`mod` =70 > AND t2.`mod` =100 > > ale może ktoś ma inny pomysł na rozwiązanie tego problemu?
>> czy kombinacja (id,mod) jest unikatowa? >> jak tak to: >> select id from table where mod in (70,100) group by id having count(*) = 2; >> >> depesz > > > niestety nie jest unikatowa :-( > są jeszcze jakieś propozycje? > > Pozdrawiam > Pawel >
select distinct id from tab2 t where t.mod = 100 and exists (select 1 from tab2 x where x.id = t.id and x.mod = 70)
indeks na (id,mod) i powinno być dobrze.
Rafał
hubert depesz lubaczewski - 11-08-2007 00:02
Dnia 09.08.2007 puchkub@poczta.onet.pl <puchkub@poczta.onet.pl> napisał/a: >> Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: >> > tabela z danymi >> > id_tab id mod >> > 1 1 50 >> > 2 1 100 >> > 3 1 70 >> > 4 2 300 >> > 5 2 100 >> > 6 3 70 >> > ale może ktoś ma inny pomysł na rozwiązanie tego problemu? >> >> czy kombinacja (id,mod) jest unikatowa? >> jak tak to: >> select id from table where mod in (70,100) group by id having count(*) = 2; >> >> depesz > > > niestety nie jest unikatowa :-( > są jeszcze jakieś propozycje?
select id from dane where mod = 70 intersect select id from dane where mod = 100
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
puchkub@poczta.onet.pl - 11-08-2007 00:02
> Dnia 09.08.2007 puchkub@poczta.onet.pl <puchkub@poczta.onet.pl> napisał/a: > >> Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: > >> > tabela z danymi > >> > id_tab id mod > >> > 1 1 50 > >> > 2 1 100 > >> > 3 1 70 > >> > 4 2 300 > >> > 5 2 100 > >> > 6 3 70 > >> > ale może ktoś ma inny pomysł na rozwiązanie tego problemu? > >> > >> czy kombinacja (id,mod) jest unikatowa? > >> jak tak to: > >> select id from table where mod in (70,100) group by id having count(*) = 2; > >> > >> depesz > > > > > > niestety nie jest unikatowa :-( > > są jeszcze jakieś propozycje? > > select id from dane where mod = 70 > intersect > select id from dane where mod = 100 > > depesz > > -- > quicksil1er: "postgres is excellent, but like any DB it requires a > highly paid DBA. here's my CV!" :) > http://www.depesz.com/ - blog dla ciebie (i moje CV)
coś nie chce mi działać to intersect, być może w mysql 5.0.24 nie zostało zaimpelementowane?
Pawel
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
hubert depesz lubaczewski - 11-08-2007 00:02
Dnia 10.08.2007 puchkub@poczta.onet.pl <puchkub@poczta.onet.pl> napisał/a: > coś nie chce mi działać to intersect, być może w mysql 5.0.24 nie zostało > zaimpelementowane?
aaargh. jakbym wiedział, że chodzi o mysql'a to bym się nie wtrącał. pisz na przyszłość o jaką bazę ci chodzi. nawet w faq jest o tym informacja.
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
Pawel - 11-08-2007 00:02
> puchkub@poczta.onet.pl wrote: > >> Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: > >>> tabela z danymi > >>> id_tab id mod > >>> 1 1 50 > >>> 2 1 100 > >>> 3 1 70 > >>> 4 2 300 > >>> 5 2 100 > >>> 6 3 70 > >>> ale może ktoś ma inny pomysł na rozwiązanie tego problemu? > >> czy kombinacja (id,mod) jest unikatowa? > >> jak tak to: > >> select id from table where mod in (70,100) group by id having count(*) = 2; > >> > >> depesz > > > > > > niestety nie jest unikatowa :-( > > są jeszcze jakieś propozycje? > > Chyba to powinno zadziałać: > count(distinct mod) > > -- > P.M.
oczywiście ma Pan racje działa jak należy. Dziękuję
Pozdrawiam Pawel
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
puchkub@poczta.onet.pl - 11-08-2007 00:02
> Użytkownik <puchkub@poczta.onet.pl> napisał w wiadomości > news:374c.00000129.46bb66b3@newsgate.onet.pl... > >> czy kombinacja (id,mod) jest unikatowa? > >> jak tak to: > >> select id from table where mod in (70,100) group by id having count(*) = > >> 2; > >> > >> depesz > > > > > > niestety nie jest unikatowa :-( > > są jeszcze jakieś propozycje? > > > > Rozwiń tylko wyżej podany pomysł > > select id from (select distinct t.id , t.mod table t) where mod in (70,100) > group by id having count(*) = 2; > > Pozdrawiam > Adam > >
działające zapytanie wygląda tak select id from table where mod in (70,100) group by id having count(distinct mod) = 2
dziękuje za pomoc.
Pozdrawiam Pawel
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Pawel - 11-08-2007 00:02
> Dnia 10.08.2007 puchkub@poczta.onet.pl <puchkub@poczta.onet.pl> napisał/a: > > coś nie chce mi działać to intersect, być może w mysql 5.0.24 nie zostało > > zaimpelementowane? > > aaargh. jakbym wiedział, że chodzi o mysql'a to bym się nie wtrącał. > pisz na przyszłość o jaką bazę ci chodzi. nawet w faq jest o tym > informacja. > > depesz > > -- > quicksil1er: "postgres is excellent, but like any DB it requires a > highly paid DBA. here's my CV!" :) > http://www.depesz.com/ - blog dla ciebie (i moje CV)
oczywiście jest w pierwszym poście wzmianka że chodzi o mysqla, ale pomimo to dziękuje za chęci. Dobrze wiedzieć że w postgres jest coś takiego.
a ostatecznie zapytanie wygląda tak: SELECT id FROM tab2 WHERE `mod` IN ( 70, 100 ) GROUP BY id HAVING count( DISTINCT `mod` ) =2
Pozdrawiam Pawel
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
puchkub@poczta.onet.pl - 11-08-2007 00:02
> puchkub@poczta.onet.pl napisał(a): > >> Dnia 09.08.2007 Pawel <puchkubWYTNIJTO@poczta.onet.pl> napisał/a: > > Witam > > Proszę o pomoc (wskazówkę) jak zbudować przejrzyste zapytanie do mysqla. > > > > tabela z danymi > > id_tab id mod > > 1 1 50 > > 2 1 100 > > 3 1 70 > > 4 2 300 > > 5 2 100 > > 6 3 70 > > > > > > jak wybrać wszystkie id dla mod=100 i mod=70, czyli jedno id (np. 1) musi mieć > > przypisane obie wartości mod (50 i 100)? > > > > Oczywiście istnieje możliwość odwoływania się przez INNER JOIN do tej samej > > tabeli i zapytanie wyglądało by mniej więcej tak: > > > > SELECT * > > FROM tab2 t2 > > INNER JOIN tab2 t1 ON t2.id = t1.id > > WHERE t1.`mod` =70 > > AND t2.`mod` =100 > > > > ale może ktoś ma inny pomysł na rozwiązanie tego problemu? > > > >> czy kombinacja (id,mod) jest unikatowa? > >> jak tak to: > >> select id from table where mod in (70,100) group by id having count(*) = 2; > >> > >> depesz > > > > > > niestety nie jest unikatowa :-( > > są jeszcze jakieś propozycje? > > > > Pozdrawiam > > Pawel > > > > select distinct id > from tab2 t > where t.mod = 100 > and exists (select 1 from tab2 x > where x.id = t.id > and x.mod = 70) > > > indeks na (id,mod) i powinno być dobrze. > > Rafał
oczywiście działa, ale ostatecznie wybrałem takie rozwiązanie może bardziej czytelne (oczywiście to rzecz gustu)
SELECT id FROM tab2 WHERE `mod` IN ( 70, 100 ) GROUP BY id HAVING count( DISTINCT `mod` ) =2
Dziękuje za pomoc. Pozdrawiam Pawel
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
zanotowane.pldoc.pisz.plpdf.pisz.pldirtyboys.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 |
|