Řazení s grupováním v MySQL

Phaal

Řazení s grupováním v MySQL
« kdy: 23. 09. 2011, 20:03:47 »
Zdravím

Řeším problém v MySQL, mám tabulky:

objednavka:
id_objednavky| adresa_atd
1| adr1
2| adr2
3| adr3
4| adr4

polozka:
id_objednavky| polozka
1| CCC
2| AAA
2| DDD
3| BBB
4| DDD
4| AAA
4| CCC

a potrebuji vytvorit neco takoveho:
id_objednavky| polozka| adresa_atd
2| AAA| adr2
2| DDD| adr2
4| AAA| adr4
4| CCC| adr4
4| DDD| adr4
3| BBB| adr3
1| CCC| adr1

Tedy, chtel bych udělat setřízený select tak, abych třídil podle 'polozka' ale zároven měl stejné 'id_objednavky' pod sebou.

Teoreticky něco takového, že si tabulky joinnu
- udělám si skupinky podle 'id_objednavky'
- uvnitř tyto skupinky třídím podle 'polozka'
- a skupinky pak za sebou setřídím podle polozky ktera je na prvním místě.

Šlo by něco takového spáchat nějakým dobře sestaveným dotazem? Abych docílil takového výsledku?
Samozřejmě je mi jasné že bych to mohl řešit v ORM stylu nějakým tím dočítáním, ale více by se mi hodilo kdybych to mohl udělat přímo v SQL.

Předem děkuji za jakékoliv návrhy a rady.


Tomáš Bláha

Re: Řazení s grupováním v MySQL
« Odpověď #1 kdy: 23. 09. 2011, 20:23:32 »
ORDER BY id_objednavky, polozka

Phaal

Re: Řazení s grupováním v MySQL
« Odpověď #2 kdy: 23. 09. 2011, 21:06:40 »
No, pokud pouziji:
Kód: [Vybrat]
SELECT p.id_objednavky, p.polozka, o.adresa
FROM objednavka o
LEFT JOIN polozka p ON ( o.id_objednavky = p.id_objednavky )
ORDER BY p.id_objednavky, p.polozka

Tak se mi tabulka seradi takto:
Kód: [Vybrat]
1 CCC adr1
2 AAA adr2
2 DDD adr2
3 BBB adr3
4 AAA adr4
4 CCC adr4
4 DDD adr4

Coz bohuzel neni tak jak bych potreboval.
Tabulka by musela zacinat zaznamem  2 AAA nebo 4 AAA a pokracovat podle pravidel které jsem popsal v prvním postu.

deadmail

Re: Řazení s grupováním v MySQL
« Odpověď #3 kdy: 23. 09. 2011, 22:53:43 »
najprv zoradit objednavky podla najmensej polozky a potom doplnit vsetky polozky ...

Kód: [Vybrat]
SELECT *
FROM (
   SELECT objednavka.*
   FROM objednavka
   JOIN polozka
   USING (id_objednavky)
   GROUP BY id_objednavky
   ORDER BY MIN(polozka), id_objednavky) AS obj
LEFT JOIN (
   SELECT * FROM polozka
   ORDER BY polozka) AS pol
USING (id_objednavky)

Akurat poradie vyslednych stlpcov je trosku ine ;-)

Phaal

Re: Řazení s grupováním v MySQL
« Odpověď #4 kdy: 24. 09. 2011, 09:24:34 »
Perfektní, přesně takhle jsem to potřeboval.

Díky moc deadmail!