Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem SQL dotaz - menší rozcvička

Ahoj.

Určitě to víte :-)

Mám následující dotaz:

select p.products_id, p.products_model, pd.products_name, m.manufacturers_name, p.products_quantity, 
    p.products_image, p.products_weight, p.manufacturers_id, p.products_tax_class_id, p.abra_unit, 
    final_price, order_count, view_count, abra_sc_id, abra_srm_id 
from listing_table_products p 
left join listing_table_products_name pd on p.products_id=pd.products_id 
left join listing_table_manufacturers m on p.products_id=m.products_id order by pd.products_name

A z tohoto dotazu, který už je defakto hotový potřebuji vytáhnout maximální cenu (final_price) a minimální cenu (final_price).
Toto je jednoduché (fce MIN a MAX). Já ovšem potřebuji k přislušné maximální a minimální ceně vytáhnout i její příslušné products_tax_class_id.

Jak to provést?

Díky

Předmět Autor Datum
select max(final_price), (select products_tax_class_id from ... where final_price = max(final_price)…
Wikan 12.07.2013 09:05
Wikan
Jen si musi vyresit pripady, kdy bude vic stejnych maximalnich a minimalnich cen
Jan Fiala 12.07.2013 09:09
Jan Fiala
Dobrá. Nevidíte chybu v tomto dotazu? Nechce mi ho to sežrat: SELECT MIN(final_price) as mincena, (…
Flash_Gordon 12.07.2013 09:19
Flash_Gordon
Přesněji, pokud doplním do dotazu podmínku where final_price = MIN(final_price), tak dotaz přestane…
AZOR 12.07.2013 14:52
AZOR
select p.products_tax_class_id from listing_table_products p left join listing_table_products_name p…
Flash_Gordon 12.07.2013 14:56
Flash_Gordon
select max(p2.final_price),p.products_id, p.products_model, pd.products_name, m.manufacturers_name,…
hynajs 12.07.2013 10:15
hynajs
Jedná se o MySQL: TOTO funguje: select p.products_tax_class_id from listing_table_products p left…
Flash_Gordon 12.07.2013 10:23
Flash_Gordon
Zkus MIN(pd.final_price) a přehoď from listing_table_products pd left join listing_table_products_n…
hynajs 12.07.2013 10:30
hynajs
no tak ten dotaz nie je vobec defacto hotovy. chces tam prasnut funkciu min a max a nasledne groupov…
wam_Spider007 12.07.2013 10:58
wam_Spider007
Mě by stačilo, klidně to rozdělit na dotazy třeba 2. Hlavně , aby tam bylo MIN(final_price) a k němu…
Flash_Gordon 12.07.2013 11:02
Flash_Gordon
ten ERD diagram by teda nebol?
wam_Spider007 12.07.2013 14:15
wam_Spider007
Předně děkuji za ochotu. Diagram k tomu bohužel nemáme, takže nemůžu dodat :-). Zkouším to pomocí v…
Flash_Gordon 12.07.2013 14:28
Flash_Gordon
a co to píše nebo dělá? Když pominu že je to docela prasácky napsané - ve smyslu proč aliasuješ tabu…
AZOR 12.07.2013 14:37
AZOR
Hlavně to order_by tam nemá co dělat. Má tam být imho group_by a pokud ano pak tam nemá co dělat ani…
AZOR 12.07.2013 14:40
AZOR
Taky nefunguje: select p.products_tax_class_id from listing_table_products p left join listing_tabl…
Flash_Gordon 12.07.2013 14:41
Flash_Gordon
taky by jsi mohl se naučit komunikovat - nefunguje snad umíš rozepsat a rozpadnout na konkrétní popi…
AZOR 12.07.2013 14:45
AZOR
Jsem ještě neviděl, aby někdo psal SQL dotazy metodou pokus-omyl... Co tak si ujasnit, jaký výsledek…
MaSo 12.07.2013 14:46
MaSo
To není pokus omyl. Vzal jsem zdravé jádro a teď si ho upravuju pro sebe. Dotaz je rozdělen na dvě č…
Flash_Gordon 12.07.2013 14:48
Flash_Gordon
Tak jsem koukal na google co je to za chybu - a tam jasně píšou nemůžeš odkazovat na tabulku, která…
AZOR 12.07.2013 14:54
AZOR
uff, no v takom matrixe len tazko najdes chybu. trochu by to chcelo aj strukturovat, nech sa to da c…
wam_Spider007 12.07.2013 15:25
wam_Spider007
final_price je v tabulce listing_table_products neboli alias p.
Flash_Gordon 12.07.2013 15:30
Flash_Gordon
ok uz sa zacinam orientovat. a za ake atributy chces ziskat to min a max final_price. Predpokladam,…
wam_Spider007 12.07.2013 16:02
wam_Spider007
Ne, ne. Z p.final_price chci minimum a maximum. To je vlastně tatáž tabulka.
Flash_Gordon 12.07.2013 16:34
Flash_Gordon
A proc, ze Ti nestačí to select p.products_tax_class_id,MAX(final_price) from listing_table_product…
AZOR 12.07.2013 18:13
AZOR
Ot:mě by spíš zajímalo proč je to kurna temporary tabulka To by byla dlouha historie. V kazdem prip…
Flash_Gordon 12.07.2013 18:47
Flash_Gordon
No dlouhá historie - jen jsem nakouk co to dělá v Mysql a je to to co v Oracle, pokud jsem koukal sp…
AZOR 12.07.2013 18:56
AZOR
OK. Otestuji to a pak vam dam vedet. Nepocital jsem s tim, ze to bude tak komplikovane. Zkouset to o… poslední
Flash_Gordon 13.07.2013 09:23
Flash_Gordon

Dobrá. Nevidíte chybu v tomto dotazu? Nechce mi ho to sežrat:

SELECT MIN(final_price) as mincena, (SELECT products_tax_class as tax_min from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id order by pd.products_name where final_price = min(final_price)) as minid , MAX(final_price) as maxcena from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id order by pd.products_name

A protože je to..... dočasná tabulka, špatně se to ladí.

A nejsem si jistý jestli to může takto (jak radí Wikan) vůbec být.

Přesněji, odmítá mi to vzít tento subdotaz:

"SELECT p.products_tax_class_id as maxcena from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id order by pd.products_name where final_price = min(final_price)"

Přesněji, pokud doplním do dotazu podmínku where final_price = MIN(final_price), tak dotaz přestane fungovat.
Bez této podmínky funguje.

Přesněji, pokud doplním do dotazu podmínku where final_price = MIN(final_price), tak dotaz přestane fungovat.
Bez této podmínky funguje.

Však to funguje, to co píšu dole - ale musíš to z grupovat a musíš to napsat v having klauzuli

http://dev.mysql.com/doc/refman/5.0/en/group-by-ex tensions.html

viz jejich příklad:

SELECT name, COUNT(name) FROM orders
GROUP BY name
HAVING COUNT(name) = 1;

Akorád místo count máš MIN/MAX a místo 1 bude ta cena produktu.

select p.products_tax_class_id from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id group by p.products_tax_class_id HAVING final_price = (SELECT MAX(final_price) as maxcena2 from listing_table_products p1 left join listing_table_products_name pd1 on p1.products_id=pd1.products_id left join listing_table_manufacturers m1 on p1.products_id=m1.products_id order by pd1.products_name)

Could not run query: Can't reopen table: 'p'

select max(p2.final_price),p.products_id, p.products_model, pd.products_name, m.manufacturers_name, p.products_quantity, 
    p.products_image, p.products_weight, p.manufacturers_id, p.products_tax_class_id, p.abra_unit, 
    final_price, order_count, view_count, abra_sc_id, abra_srm_id 
from listing_table_products p 
join listing_table_products as p2 on p.products_id=p2.products_id
atd.........................

Jedná se o MySQL:

TOTO funguje:

select p.products_tax_class_id from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id

TOTO nefunguje:

select p.products_tax_class_id from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id where final_price = MIN(final_price)

a TOTO taky nefunguje:

select p.products_tax_class_id, MIN(final_price) as mincena from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id

Zkus MIN(pd.final_price) a přehoď

from listing_table_products pd left join listing_table_products_name p

V principu join tabulky na sebe samu v podobných případech funguje, schválně jsem analogický postup úspěšně zkusil na jedné své tabulce.

no tak ten dotaz nie je vobec defacto hotovy. chces tam prasnut funkciu min a max a nasledne groupovat cez znacne mnozstvo poli, co je uplne zly postup. spravne je spravit si group potrebnych hodnot pre nejaky identifikator a potom k nemu dalej prijoinovat cez dane ID ostatne polia s popismi.
dalej ... nie je jasne z akej tabulke je pole final_price (chyba tam alias). a tiez polia order_count a podobne.
Zisiel by sa zjednoduseny ERD diagram aj s kardinalitou tychto tabuliek, lebo takto len tapame v tme.

Předně děkuji za ochotu. Diagram k tomu bohužel nemáme, takže nemůžu dodat :-).

Zkouším to pomocí vnořeného selectu, ale ten taky nefunguje:

select p.products_tax_class_id from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id where final_price = (SELECT MAX(final_price) as maxcena from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id order by pd.products_name)

Nevíte někdo proč ani toto nefunguje?

a co to píše nebo dělá? Když pominu že je to docela prasácky napsané - ve smyslu proč aliasuješ tabulky stejně - všechno tam máš dvakrát, přestože na sebe mají viditelnost.

Taky nefunguje:

select p.products_tax_class_id from listing_table_products p left join listing_table_products_name pd on p.products_id=pd.products_id left join listing_table_manufacturers m on p.products_id=m.products_id where final_price = (SELECT MAX(final_price) as maxcena from listing_table_products p1 left join listing_table_products_name pd1 on p1.products_id=pd1.products_id left join listing_table_manufacturers m1 on p1.products_id=m1.products_id order by pd1.products_name)

Hlásí:

Could not run query: Can't reopen table: 'p'

taky by jsi mohl se naučit komunikovat - nefunguje snad umíš rozepsat a rozpadnout na konkrétní popis chyby - sémantická, syntaktická, runtime vs neočkávaný výsledek.

Pořád proč to chceš dělat bez group by a having final_price=max(final_price)

Tak jsem koukal na google co je to za chybu - a tam jasně píšou nemůžeš odkazovat na tabulku, která je temporary více než jednou. To znamená přepsat to, která z nich je temporary netuším, ale podle názvu by neměla být žádná.

uff, no v takom matrixe len tazko najdes chybu. trochu by to chcelo aj strukturovat, nech sa to da citat.
V ktorej tabulke je vlastne pole final_price?

select
 p.products_tax_class_id
from listing_table_products p

left join listing_table_products_name pd
   on p.products_id=pd.products_id

left join listing_table_manufacturers m
   on p.products_id=m.products_id

where final_price = (
      SELECT MAX(final_price) as maxcena
      from listing_table_products p1

      left join listing_table_products_name pd1
         on p1.products_id=pd1.products_id

      left join listing_table_manufacturers m1
         on p1.products_id=m1.products_id

      order by pd1.products_name
      )

A proc, ze Ti nestačí to

select
p.products_tax_class_id,MAX(final_price)
from listing_table_products p group by p.products_tax_class_id ?

Já Mysql rozumím jako koza petrželi, nicméně googlil jsem co to znamená ta chybová hláška Can not reopen, protože tenhle select je syntaticky validní, ačkoliv když se na něj podivám tak tam vidí zbytečné joiny, order by, které tam nemá co dělat a to = také není v souladu s tím, co chceš. Nicméně zpět k té chybě Can not reopen četl jsi co jsem vygooglil? Nemužeš dvakrát odkazovat stejnou temporary tabulk u - mě by spíš zajímalo proč je to kurna temporary tabulka

No dlouhá historie - jen jsem nakouk co to dělá v Mysql a je to to co v Oracle, pokud jsem koukal správně - data přežjívají jen session, tak jak v tom mohou být produkty? Pokud je to nějaký temp do kterého se to lije, tak to nahrad zdrojem (pokud výkon bude stačit) z hardwarové tabulky.

Zpět do poradny Odpovědět na původní otázku Nahoru