Výsledky 1 až 13 z 13

Téma: [SQL] MySQL 5.5 - GROUP BY

  1. #1

    Standardní [SQL] MySQL 5.5 - GROUP BY

    Ahoj, mořím se druhý den s jedním dotazem a už mi z toho začíná hrabat...

    Jednoduchá databáze cen, mějme třeba vše v jedné tabulce (view) jako
    - zboží
    - cena
    - datum
    - obchod

    Jde mi o select, který vypíše zboží spolu s poslední (nejnovější datum) cenou od každého obchodu.
    Pokud použiju group by obchod, tak neumím ovlivnit které hodnoty vyhodí, takže pak mám jednu cenu, ale za libovolné datum.

    Asi si už sedím na vedení... vyspání taky nepomohlo, tak budu vděčný za nakopnutí správným směrem.
    PC: GA-EP45-DS3R | E8400 + Ninja | 8GB | 80GB SSD X25-M | Zotac 9500GT | Asus Xonar DX | 2x Hauppauge WinTV HVR-1300 | Enermax MODU82+ 525W | Lancool K1
    Foto: Canon 20D | Tokina 12-24/4 | Canon 24-105/4 L IS USM | Canon 50/1,8 | Giottos MTL3361 + 1301-621C | Nodal Ninja NN5

  2. #2
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    360

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Tak v rychlosti mě napadlo následující:

    Kód:
    SELECT [xx].[zbozi], [xx].[obchod], [yy].cena
    from
    (SELECT [zbozi]
          ,[obchod]
          ,max([datum]) as max_datum
      FROM [tabulka]  GROUP BY ZBOZI, obchod
    ) [xx]
    
    left outer join [tabulka] [yy] on
    
    [xx].[zbozi] = [yy].[zbozi]
    and
    [xx].[obchod] = [yy].[obchod]
    and
    [xx].[max_datum] = [yy].[datum]
    První částí si vytahám max. datumy pro kombinace zboží - obchod, druhou částí tu tabulku najoinuju na sebe samou a dotáhnu si k tomu ty ceny... Asi by to šlo napsat elegantněji, ale já jsem to takhle zprovoznil... Nemám k dispozici mySQL, zkoušel jsem to na MS SQL serveru, ale snad jsem nepoužíval žádné "specialitky"
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  3. #3

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Jo takhle jsem to zkoušel taky, problém je v tom že už ten vnitřní subselect vrací nesmysly. Vybere sice poslední datumy, ale ceny k nim vyhazuje z úplně jiných datumů. Nerozumím tomu.
    PC: GA-EP45-DS3R | E8400 + Ninja | 8GB | 80GB SSD X25-M | Zotac 9500GT | Asus Xonar DX | 2x Hauppauge WinTV HVR-1300 | Enermax MODU82+ 525W | Lancool K1
    Foto: Canon 20D | Tokina 12-24/4 | Canon 24-105/4 L IS USM | Canon 50/1,8 | Giottos MTL3361 + 1301-621C | Nodal Ninja NN5

  4. #4
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    360

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Tak to nechápu, mně to na zkušebních datech fungovalo v pohodě, ale je fakt že jsem si tam naflákal tabulku jen asi o pěti řádcích. Jestli mi můžeš někam poslat třeba jen nějaký vzorek dat, klidně si s tím pohraju ještě zítra, pokud to nevyřešíš...
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  5. #5

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Tak sem pastni svuj dotaz, daviduv subselect nesmysly urcite nevraci.

    Problem Davidova dotazu je akorat v tom, ze muze vratit vic nez jeden radek ke kombinaci zbozi/obchod (pokud bylo muze byt za jeden den vic cen). Tohle se vubec dela v SQL strasne blbe, v Oracle se to da elegantne resit analytickymi funkcemi, ale ty v MySQL podle vseho nejsou.
    Lenovo X200 | Lenovo Ultrabase | Sennheiser HD 595 | Fujitsu Siemens P19-2 Black | Logitech Internet Navigation Keyboard | Logitech VX Revolution

  6. #6
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    360

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Jj máš recht. Já jsem předpokládal (ano, předpoklad je v IT obvykle matkou průseru ), že by se nic takového stát nemělo. I kdyby, tak snad při použití formátu s uvedením datumu I ČASU by už to byla zatracená náhoda... Ale nevíme přesně, v jakém formátu lze ten časový údaj získávat...

    Chtělo by to vážně nějaký vzorek "živých" dat, pokud to není něco supertajného, do té doby tu můžeme dost tápat
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  7. #7

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Zkusím hodit testovací data..

    Kód:
    mysql> select id_disku, model, dtime, cena, id_obchodu, obchod from v_ceny_disku;
    +----------+-------------+---------------------+---------+------------+----------------+
    | id_disku | model       | dtime               | cena    | id_obchodu | obchod         |
    +----------+-------------+---------------------+---------+------------+----------------+
    |        1 | ST2000DL003 | 2012-05-14 08:24:28 | 2734.00 |          1 | AlfaComp       |
    |        1 | ST2000DL003 | 2012-04-13 09:55:55 | 2799.00 |          1 | AlfaComp       |
    |        1 | ST2000DL003 | 2012-03-15 09:56:44 | 2820.00 |          1 | AlfaComp       |
    |        1 | ST2000DL003 | 2012-03-01 09:57:54 | 2797.00 |          1 | AlfaComp       |
    |        1 | ST2000DL003 | 2012-01-30 09:58:15 | 3341.00 |          1 | AlfaComp       |
    |        2 | WD20EARX    | 2012-01-30 10:05:55 | 3100.00 |          1 | AlfaComp       |
    |        2 | WD20EARX    | 2012-03-01 10:06:12 | 3060.00 |          1 | AlfaComp       |
    |        2 | WD20EARX    | 2012-03-15 10:06:37 | 2840.00 |          1 | AlfaComp       |
    |        2 | WD20EARX    | 2012-04-13 10:06:49 | 2720.00 |          1 | AlfaComp       |
    |        2 | WD20EARX    | 2012-05-14 10:07:43 | 2700.00 |          1 | AlfaComp       |
    |        3 | WD30EZRX    | 2012-01-30 10:09:53 | 4277.00 |          1 | AlfaComp       |
    |        3 | WD30EZRX    | 2012-03-01 10:10:11 | 4011.00 |          1 | AlfaComp       |
    |        3 | WD30EZRX    | 2012-03-15 10:10:39 | 4059.00 |          1 | AlfaComp       |
    |        3 | WD30EZRX    | 2012-04-13 10:10:49 | 3820.00 |          1 | AlfaComp       |
    |        3 | WD30EZRX    | 2012-05-14 10:11:08 | 3813.00 |          1 | AlfaComp       |
    |        3 | WD30EZRX    | 2012-05-14 12:23:26 | 3895.00 |          2 | Czech Computer |
    |        3 | WD30EZRX    | 2012-05-14 12:24:10 | 4055.00 |          3 | Alza           |
    |        3 | WD30EZRX    | 2012-05-14 12:24:10 | 3907.00 |          4 | Softcom        |
    +----------+-------------+---------------------+---------+------------+----------------+
    A výsledek dotazu
    Kód:
    mysql> SELECT serie, model, MAX(dtime) as max_datum, cena, obchod FROM v_ceny_disku GROUP BY model,obchod;
    +-------------------------+-------------+---------------------+---------+----------------+
    | serie                   | model       | max_datum           | cena    | obchod         |
    +-------------------------+-------------+---------------------+---------+----------------+
    | Seagate Barracuda Green | ST2000DL003 | 2012-05-14 08:24:28 | 2734.00 | AlfaComp       |
    | WD Caviar Green         | WD20EARX    | 2012-05-14 10:07:43 | 3100.00 | AlfaComp       |
    | WD Caviar Green         | WD30EZRX    | 2012-05-14 10:11:08 | 4277.00 | AlfaComp       |
    | WD Caviar Green         | WD30EZRX    | 2012-05-14 12:24:10 | 4055.00 | Alza           |
    | WD Caviar Green         | WD30EZRX    | 2012-05-14 12:23:26 | 3895.00 | Czech Computer |
    | WD Caviar Green         | WD30EZRX    | 2012-05-14 12:24:10 | 3907.00 | Softcom        |
    +-------------------------+-------------+---------------------+---------+----------------+
    6 rows in set (0.00 sec)
    Viditelně např. cena WD20EARX je špatně, datum sice mělo by to vracet 2700,-
    Stejně tak u WD30EZRX je chybně cena 4277,-

    Vážně nechápu...
    PC: GA-EP45-DS3R | E8400 + Ninja | 8GB | 80GB SSD X25-M | Zotac 9500GT | Asus Xonar DX | 2x Hauppauge WinTV HVR-1300 | Enermax MODU82+ 525W | Lancool K1
    Foto: Canon 20D | Tokina 12-24/4 | Canon 24-105/4 L IS USM | Canon 50/1,8 | Giottos MTL3361 + 1301-621C | Nodal Ninja NN5

  8. #8

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    To ja nechapu, ze ti takovej dotaz vubec projde, v SELECT klauzuli bys mel mit jenom sloupce z GROUP BY a agregacni funkce. Kazdopadne tvuj dotaz nema s Davidovym vubec nic spolecneho.
    Lenovo X200 | Lenovo Ultrabase | Sennheiser HD 595 | Fujitsu Siemens P19-2 Black | Logitech Internet Navigation Keyboard | Logitech VX Revolution

  9. #9
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    360

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Jj... za tohle bys měl dostat vylískáno, v případě mrkvošrotího SQL serveru třeba takto:

    Kód:
    Column '[tabulka].serie' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  10. #10

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    No jen do mě... Uznávám, že MySQL si moc hlavu neláme s ANSI a z toho vznikají blbý návyky
    Nicméně pokud do group by hodím všechny sloupce co potřebuju v selectu, pak to zase nebude fungovat tak jak potřebuju...

    Asi sem fakt přetaženej..
    PC: GA-EP45-DS3R | E8400 + Ninja | 8GB | 80GB SSD X25-M | Zotac 9500GT | Asus Xonar DX | 2x Hauppauge WinTV HVR-1300 | Enermax MODU82+ 525W | Lancool K1
    Foto: Canon 20D | Tokina 12-24/4 | Canon 24-105/4 L IS USM | Canon 50/1,8 | Giottos MTL3361 + 1301-621C | Nodal Ninja NN5

  11. #11

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Ses, protoze takhle se proste GROUP BY pouzivat neda. Podivej se na Daviduv dotaz jeste jednou, uvidis, ze v poddotazu ma opravdu jen GROUP BY sloupce + jednu agregacni funkci a teprve ve vnejsim dotazu si k tomu pomoci JOIN doda zbyle sloupce.
    Lenovo X200 | Lenovo Ultrabase | Sennheiser HD 595 | Fujitsu Siemens P19-2 Black | Logitech Internet Navigation Keyboard | Logitech VX Revolution

  12. #12
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    360

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Spíš už na to koukáš moc dlouho a motáš se v kruhu, to znám moc dobře Pokud to napíšeš tak jak jsem měl já, respektive jak ti radí frelichl, že VŠE co bude v SELECTu, bude buď "obaleno" agregační funkcí - v tomto případě max() - nebo bude v GROUP BY, mělo by to fungovat. A vzhledem k tomu, že máš datum ve formátu včetně času na sekundy, tak by se dalo předpokládat, že i duplicita záznamů v tom poddotazu bude přinejhorším velmi, velmi výjimečná.. (museli by měnit cenu 2x za sekundu)...

    EDIT: Čili poddotaz ve tvaru

    Kód:
    SELECT serie, model, MAX(dtime) as max_datum, obchod FROM v_ceny_disku GROUP BY serie, model,obchod;
    K tomu pak joinem přes model, obchod, max_datum dotáhnout sloupec cena... A mělo by to jet...
    Naposledy upravil D_a_v_i_d; 15.05.2012 v 16:21.
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  13. #13

    Standardní Re: [SQL] MySQL 5.5 - GROUP BY

    Díky za nakopnutí!, čumím do toho tak dlouho že píšu kraviny (teď sem přemejšlel proč řve chybu a na začátku vynechávám SELECT...)

    Dotaz sem se zbytkem kafe slepil do tvaru
    Kód:
    SELECT
    	b.id_disku,
    	b.model,
    	a.id_obchodu,
    	b.obchod,
    	b.cena,
    	b.dtime
    FROM
    	(
    	SELECT
    		id_disku,
    		id_obchodu,
    		MAX(dtime) AS last_datum
    	FROM
    		v_ceny_disku
    	GROUP BY
    		id_disku,
    		id_obchodu
    	) AS a
    	LEFT OUTER JOIN v_ceny_disku AS b ON a.id_disku = b.id_disku AND a.id_obchodu = b.id_obchodu AND a.last_datum = b.dtime;
    a zdá se, že na testovacích datech už vrací to co má. Jdu si dát panáka a vyspat se
    PC: GA-EP45-DS3R | E8400 + Ninja | 8GB | 80GB SSD X25-M | Zotac 9500GT | Asus Xonar DX | 2x Hauppauge WinTV HVR-1300 | Enermax MODU82+ 525W | Lancool K1
    Foto: Canon 20D | Tokina 12-24/4 | Canon 24-105/4 L IS USM | Canon 50/1,8 | Giottos MTL3361 + 1301-621C | Nodal Ninja NN5

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Podobná témata

  1. My SQL - GROUP BY
    Založil Alibetka v sekci fóra Programování
    Odpovědí: 6
    Poslední příspěvek: 21.10.2009, 09:56
  2. [MySQL] Kaskadovane GROUP BY fce
    Založil Fox!MURDER v sekci fóra Programování
    Odpovědí: 6
    Poslední příspěvek: 06.01.2008, 22:50
  3. [MySQL]Group By a Count
    Založil MEluZíNa v sekci fóra Programování
    Odpovědí: 9
    Poslední příspěvek: 09.10.2006, 23:12
  4. MS SQL a GROUP BY
    Založil xkrchnav v sekci fóra Programování
    Odpovědí: 1
    Poslední příspěvek: 23.01.2006, 15:45
  5. [MySQL] SELECT + GROUP + CONCAT
    Založil PiT v sekci fóra Programování
    Odpovědí: 1
    Poslední příspěvek: 28.10.2004, 11:15

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •