Fórum Root.cz

Hlavní témata => Server => Téma založeno: Phaal 23. 09. 2011, 20:03:47

Název: Řazení s grupováním v MySQL
Přispěvatel: Phaal 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.
Název: Re: Řazení s grupováním v MySQL
Přispěvatel: Tomáš Bláha 23. 09. 2011, 20:23:32
ORDER BY id_objednavky, polozka
Název: Re: Řazení s grupováním v MySQL
Přispěvatel: Phaal 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.
Název: Re: Řazení s grupováním v MySQL
Přispěvatel: deadmail 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 ;-)
Název: Re: Řazení s grupováním v MySQL
Přispěvatel: Phaal 24. 09. 2011, 09:24:34
Perfektní, přesně takhle jsem to potřeboval.

Díky moc deadmail!