[pgsql] Wybieranie z dwoch tabel - z drugiej tylko jeden rekord
Pseudo - 30-01-2006 10:31
[pgsql] Wybieranie z dwoch tabel - z drugiej tylko jeden rekord
Mam dwie tabelki:
wnioski i wnioski_klienci
(wnioski_klienci - sa tu klienci do poszczegolnych wnioskow, wniosek moze miec 0 klientow ale rozniewz 1, 2, 3 itp klientow)
Teraz chce wyswietlic cala liste wszystkich wnioskow: SELECT wnioski.id, wnioski.status FROM wnioski WHERE (wnioski.status=1) ORDER BY wnioski.id ASC
I to dziala ok.
Ale chcialbym jeszcze wysietlic tylko jednego najnowszego klienta(czyli takiego z najmniejszym id)
do kazdego wniosku.
Jak to wykonac ?
=?iso-8859-2?B?TWFjaWVqIFphd2Fkemnxc2tp?= - 30-01-2006 10:31
On Fri, 27 Jan 2006 15:14:30 +0100, Pseudo <pseudo@alpha.net.pl> wrote:
> > Jak to wykonac ? >
Coś w stylu...
SELECT wnioski.id, wnioski.status, MIN(wnioski_klienci.id) \ FROM wnioski INNER JOIN wnioski_klienci ON \ wnioski_klienci.wniosek=wnioski.id WHERE \ (wnioski.status=1) GROUP BY wnioski.id \ ORDER BY wnioski.id ASC
A najlepiej to poczytaj dokumentację. Wszystko tam masz ładnie opisane.
Pozdrawiam,
-- Maciej Zawadziński
Akademia Alternatywnych Systemów Operacyjnych [ http://www.aaso.pl/ ] Organizacja studencka AASOC [ http://www.aasoc.pwr.wroc.pl/ ]
=?iso-8859-2?Q?Andrzej_Str=F3=BFy=F1ski?= - 30-01-2006 10:31
Użytkownik "Pseudo" <pseudo@alpha.net.pl> napisał w wiadomości news:48119$43da2ac8$540a469c$6897@news.chello.pl.. . > Mam dwie tabelki: > > wnioski i wnioski_klienci > > (wnioski_klienci - sa tu klienci do poszczegolnych wnioskow, wniosek moze > miec 0 klientow ale rozniewz 1, 2, 3 itp klientow) > > Teraz chce wyswietlic cala liste wszystkich wnioskow: > SELECT wnioski.id, wnioski.status FROM wnioski WHERE (wnioski.status=1) > ORDER BY wnioski.id ASC > > > > I to dziala ok. > > > > Ale chcialbym jeszcze wysietlic tylko jednego najnowszego klienta(czyli > takiego z najmniejszym id) > > do kazdego wniosku. > > > > Jak to wykonac ?
Nie napisałeś nic o nazwach pól drugiej tabeli a poza tym nie do końca rozumiem jak to z tym najmniejszym id - id winiosku czy klienta? Jeśli klient ma swoje id to pewnie są trzy tabele: wnioski, klienci i spinająca je tabela wnioski_klienci. Niezaleznie od tego, poniższy sposób pewnie się Tobie przyda.
SELECT a.id, a.status, b.id_klienta FROM wnioski a INNER JOIN wnioski_klienci b ON ( a.id=b.id_wniosku and b.id_klienta= ( SELECT x.id_klienta FROM wnioski_klienci x WHERE x.id_wniosku=a.id ORDER BY x.id_klienta LIMIT 1 )) WHERE (a.status=1) ORDER BY a.id ASC
Tak na oko, to powinno działać. Jak będą problemiki to podaj więcej danych.
A.S.
Pseudo - 30-01-2006 10:31
> SELECT wnioski.id, wnioski.status, MIN(wnioski_klienci.id) \ > FROM wnioski INNER JOIN wnioski_klienci ON \ > wnioski_klienci.wniosek=wnioski.id WHERE \ > (wnioski.status=1) GROUP BY wnioski.id \ > ORDER BY wnioski.id ASC
To mi pomoglo: Takie zapytanie zwraca ok:
SELECT wnioski.id FROM wnioski INNER JOIN wnioski_wnioskodawcy ON (wnioski.id=wnioski_wnioskodawcy.wnioski_id) WHERE (wnioski.status=1) GROUP BY wnioski.id
Chce odczytac jeszcze status wniosku i imie wnioskodawcy ale to juz nie dziala:
SELECT wnioski.id, wnioski.status, wnioski_wnioskodawcy.imie FROM wnioski INNER JOIN wnioski_wnioskodawcy ON (wnioski.id=wnioski_wnioskodawcy.wnioski_id) WHERE (wnioski.status=1) GROUP BY wnioski.id
ERROR: column "wnioski.status" must appear in the GROUP BY clause or be used in an aggregate functionCzy pozostaje mi tylko uzycie dwoch zapytan ?tzn oierwsze wybieram wszystkie wnioski a pozniej w petli wybieram imie wnioskodawcy z drugiej tabeli z ORDER BY id ASC, LIMIT 1 ?
Andrzej Stróżyński - 30-01-2006 10:31
Użytkownik "Pseudo" <pseudo@alpha.net.pl> napisał w wiadomości news:ae26e$43da44c2$540a469c$12115@news.chello.pl. .. >> SELECT wnioski.id, wnioski.status, MIN(wnioski_klienci.id) \ >> FROM wnioski INNER JOIN wnioski_klienci ON \ >> wnioski_klienci.wniosek=wnioski.id WHERE \ >> (wnioski.status=1) GROUP BY wnioski.id \ >> ORDER BY wnioski.id ASC > > To mi pomoglo: > Takie zapytanie zwraca ok: > > SELECT wnioski.id FROM wnioski INNER JOIN wnioski_wnioskodawcy ON > (wnioski.id=wnioski_wnioskodawcy.wnioski_id) WHERE (wnioski.status=1) > GROUP BY wnioski.id
Ale to zapytanie nie daje żadnej informacji o kliencie (a to chciałeś uzyskać)! Dostajesz tylko listę tych wniosków, które mają choć jednego klienta (a są takie bez wnioskodawcy?) Zakładając, że wnioski.id jest unikalne to GROUP BY jest tutaj zbędne (potrzebne było razem z MIN do wyciągnięcia jednego klienta wniosku).
> Chce odczytac jeszcze status wniosku i imie wnioskodawcy ale to juz nie > dziala: > > SELECT wnioski.id, wnioski.status, wnioski_wnioskodawcy.imie FROM wnioski > INNER JOIN wnioski_wnioskodawcy ON > (wnioski.id=wnioski_wnioskodawcy.wnioski_id) WHERE (wnioski.status=1) > GROUP BY wnioski.id > > ERROR: column "wnioski.status" must appear in the GROUP BY clause or be > used in an aggregate functionCzy pozostaje mi tylko uzycie dwoch zapytan > ?tzn oierwsze wybieram wszystkie wnioski a pozniej w petli wybieram imie > wnioskodawcy z drugiej tabeli z ORDER BY id ASC, LIMIT 1 ?
Ta część zapytania (jednego!) pozwala właśnie wydobyć jednego wnioskodawcę - tego z najmniejszym id. Ciągle nie podałeś jak to z tym id klienta więc przyjmuję, że istnieje pole id_klienta w tabeli wnioski_wnioskodawcy i według niego wybieramy najnowszego klienta. Zapodaj takie coś:
SELECT a.id, a.status, b.imie FROM wnioski a INNER JOIN wnioski_wnioskodawcy b ON (a.id=b.wnioski_id and b.id_klienta= ( SELECT x.id_klienta FROM wnioski_wnioskodawcy x WHERE x.wnioski_id=a.id ORDER BY x.id_klienta LIMIT 1 )) WHERE (a.status=1) ORDER BY a.id ASC
działa?
A.S.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[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?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
=?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?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
Jak =?ISO-8859-2?Q?zamieni=E6_dwa_pola_jednej_kolumny_?==?ISO-8859-2?Q?w_dw=F3ch_rekordach_za_pomoc=B1_jednego_zapyt? ==?ISO-8859-2?Q?ania=3F?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
=?ISO-8859-2?Q?WY=B6wietlenie_rekord=F3w_pocz=B1wszy_od_?==?I SO-8859-2?Q?danej_litery=2E=2E=2E?=
[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?=
=?iso-8859-2?Q?=5BMySQL=5D_Wy=B6wietlenie_wszystkich_rekordow _zawierajacy?==?iso-8859-2?Q?ch_duplikat_a__moze_inna_struktura_bazy_danych ?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
zanotowane.pldoc.pisz.plpdf.pisz.pllubiatowo.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 |
|