[MySQL] i [VFP] Banalne - niebanalne zapytanie
Marcin Szczygieł - 11-11-2006 00:55
[MySQL] i [VFP] Banalne - niebanalne zapytanie
Witam
Mam taką tabelę w MySQL:
CREATE TABLE `stan_pocz` (`id_towar` int(10) unsigned NOT NULL default '0',; `czas` datetime NOT NULL default '0000-00-00 00:00:00',; `nr_dokument` char(12) NOT NULL default ''
i przykładowe rekordy:
id_towar czas nr_dokument 1653 31-01-2006 12:31:00 1026/A6/PZ 1653 25-05-2006 18:14:00 4583/A6/PZ 1653 01-01-2006 00:10:00 1/A6/MM 1653 01-06-2006 00:10:00 70/A6/MM 1655 10-01-2006 17:41:00 280/A6/PZ 1655 16-02-2006 17:22:00 1605/A6/IN 1655 21-01-2006 17:55:00 2755/A6/PZ 1657 26-06-2006 15:00:00 5646/A6/PZ 1657 01-01-2006 00:10:00 1/A6/IN
Chcę z tych danych wydobyć numer ostatniego (najpóźniej wystawionego) dokumentu dla każdego towaru. Czyli chcę uzyskać taki wynik:
id_towar nr_dokument 1653 70/A6/MM 1655 1605/A6/IN 1657 5646/A6/PZ
Próbobwałem zapytań w stylu:
SELECT stan_pocz.id_towar, MAX(stan_pocz.czas), stan_pocz.nr_dokument ; FROM stan_pocz GROUP BY by stan_pocz.id_towar; ORDER BY stan_pocz.id_towar
ale to nie działa ponieważ nr_dokument nie jest objęty ani funkcją agregującą, ani grupowaniem. Kombinowałem z podzapytaniami, bez efektu.
Chcę to zrobić na MySQL 4.0, ale jeżeli niezbędne będzie podzapytanie to ściągnę tabelę do FoxPro i tam odpytam.
Jak to ugryźć poleceniem SQL, bez pisania procedury? -- pozdrawiam Marcin Szczygieł marcin (SHIFT + 2) szczygiel.info
Adam - 11-11-2006 00:55
niewiem czy zadziala w 4.0 ale...
SELECT stan_pocz.id_towar, SUBSTRING_INDEX( GROUP_CONCAT(stan_pocz.nr_dokument SEPARATOR '|' ORDER BY stan_pocz.czas DESC)), '|',1) AS ostatni_dokument FROM stan_pocz GROUP BY stan_pocz.id_towar
> Witam > > Mam taką tabelę w MySQL: > > CREATE TABLE `stan_pocz` (`id_towar` int(10) unsigned NOT NULL default > '0',; > `czas` datetime NOT NULL default '0000-00-00 00:00:00',; > `nr_dokument` char(12) NOT NULL default '' > > i przykładowe rekordy: > > id_towar czas nr_dokument > 1653 31-01-2006 12:31:00 1026/A6/PZ > 1653 25-05-2006 18:14:00 4583/A6/PZ > 1653 01-01-2006 00:10:00 1/A6/MM > 1653 01-06-2006 00:10:00 70/A6/MM > 1655 10-01-2006 17:41:00 280/A6/PZ > 1655 16-02-2006 17:22:00 1605/A6/IN > 1655 21-01-2006 17:55:00 2755/A6/PZ > 1657 26-06-2006 15:00:00 5646/A6/PZ > 1657 01-01-2006 00:10:00 1/A6/IN > > Chcę z tych danych wydobyć numer ostatniego (najpóźniej wystawionego) > dokumentu dla każdego towaru. Czyli chcę uzyskać taki wynik: > > id_towar nr_dokument > 1653 70/A6/MM > 1655 1605/A6/IN > 1657 5646/A6/PZ > > Próbobwałem zapytań w stylu: > > SELECT stan_pocz.id_towar, MAX(stan_pocz.czas), stan_pocz.nr_dokument ; > FROM stan_pocz GROUP BY by stan_pocz.id_towar; > ORDER BY stan_pocz.id_towar > > ale to nie działa ponieważ nr_dokument nie jest objęty ani funkcją > agregującą, ani grupowaniem. Kombinowałem z podzapytaniami, bez efektu. > > Chcę to zrobić na MySQL 4.0, ale jeżeli niezbędne będzie podzapytanie to > ściągnę tabelę do FoxPro i tam odpytam. > > Jak to ugryźć poleceniem SQL, bez pisania procedury?
Adam - 11-11-2006 00:55
Adam napisał(a): > niewiem czy zadziala w 4.0 ale... > > SELECT stan_pocz.id_towar, > SUBSTRING_INDEX( > GROUP_CONCAT(stan_pocz.nr_dokument SEPARATOR '|' > ORDER BY stan_pocz.czas DESC)), > '|',1) AS ostatni_dokument > FROM stan_pocz > GROUP BY stan_pocz.id_towar > Mała poprawka najpierw ORDER BY stan_pocz.czas DESC a potem SEPARATOR '|' sprawdziłem działa
Adam - 11-11-2006 00:55
> SELECT stan_pocz.id_towar, MAX(stan_pocz.czas), stan_pocz.nr_dokument ; > FROM stan_pocz GROUP BY by stan_pocz.id_towar; > ORDER BY stan_pocz.id_towar
To nigdy działać nie będzie bo najpierw jest wykonywane grupowanie a dopiero pózniej sortowanie rozwiązaniem jest takie jak podałem powyżej lub w postaci dwóch zapytań:
// sortowanie tablicy fizycznie po czasie ALTER TABLE test ORDER BY test.czas DESC ;
// proste grupowanie powinno dzialac w 99% ale nie ma gwarancji SELECT test.id_t, test.id_d FROM test GROUP BY test.id_t
Marcin Szczygieł - 11-11-2006 00:55
Użytkownik "Adam" <admoz@gazeta.pl> napisał w wiadomości news:eeqt9r$f4b$1@inews.gazeta.pl... >> SELECT stan_pocz.id_towar, >> SUBSTRING_INDEX( >> GROUP_CONCAT(stan_pocz.nr_dokument SEPARATOR '|' >> ORDER BY stan_pocz.czas DESC)), >> '|',1) AS ostatni_dokument >> FROM stan_pocz >> GROUP BY stan_pocz.id_towar >> > Mała poprawka > najpierw ORDER BY stan_pocz.czas DESC > a potem SEPARATOR '|' > sprawdziłem działa
Ja jeszcze nie sprawdziłem, ale z tego co doczytałem w dokumentacji wynika że faktycznie będzie działać. Wielkie dzieki! Co prawda już zrobiłem "obejście" procedurką w VFP ale jak najbardziej skorzystam z Twojej podpowiedzi. -- pozdrawiam Marcin Szczygieł marcin (SHIFT + 2) szczygiel.info
Marcin Szczygieł - 11-11-2006 00:55
Użytkownik "Marcin Szczygieł" <marcin.wytnijto@wytnijto.szczygiel.info> napisał w wiadomości news:eerdmo$39v$1@news.onet.pl... >> sprawdziłem działa > > Ja jeszcze nie sprawdziłem, ale z tego co doczytałem w dokumentacji > wynika że faktycznie będzie działać.
Nie działa. Doczytałem dokładniej, że GROUP_CONCAT działa od wersji 4.1. Pozostaje mi więc moja procedurka. W każdym razie dzięki jeszcze raz za pomoc. -- pozdrawiam Marcin Szczygieł marcin (SHIFT + 2) szczygiel.info
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[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?=
[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?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
zanotowane.pldoc.pisz.plpdf.pisz.plmelooonka.opx.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 |
|