ďťż
 
[MySQL] i [VFP] Banalne - niebanalne zapytanie ďťż
 
[MySQL] i [VFP] Banalne - niebanalne zapytanie
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • melooonka.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com