Stránka: 1 z 1
| [ Príspevkov: 19 ] | |
Autor | Správa |
---|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
Čavte poradíte mi prosím s týmto problémom: mám 4 tabuľky products (product_id, name) colors(color_id, product_id, name) sizes(size_id, product_id, name) prices(price_id, color_id, size_id, product_id, value, value_discount, available=1|NULL) všetky sú poprepájané cez foreign kľúče (products.product_id=colors.product_id, atď..) jeden produkt má viac cien v závislosti od kombinácie farba - velkosť Ako vybrať všetky produkty a pre každý produkt najnižšiu cenu aj ked by cenu žiadnu nemal alebo by žiadna nebola available ??? + usporiadať ich podla cenydá sa to cez jeden select alebo vybrať všetky produkty a potom to prehnať cez foreach vytiahnut vsetky ceny a potom to spracovat cez polia ? pozor!! skutočne usporiadať podľa ceny - čiže treba brať do úvahy aj zľavnenú cenu lámem si nad tým hlavu už veľmi dlho
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
Presunul som ti to do DB, toto je ciste problem SQL. Nie, urcite nevytahuj uplne vsetko, je to strasne neefektivne, DB server to spravi omnoho rychlejsie a lepsie, nehovoriac o pamati, ktoru usetris. Kód: SELECT p.product_id, p.name, MIN(x.value) FROM products p LEFT JOIN prices x ON p.id = x.product_id WHERE x.available IS NOT NULL GROUP BY p.product_id, p.name ORDER BY MIN(x.value) Ak discount je nejaka zlava, mozno budes chciet pouzivat [c]MIN(x.value - x.value_discount)[/c]. Nie som si isty, ci poznam spravny zapis JOINu, som zvyknuty na Oraclovske (+), tak ma pripadne opravte. Maju sa dve rovnake tricka (rovnake products.id) s velkostami M a L chapat ako dva rozne produkty? Ak ano, treba zmenit.
|
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
value_discount je hodnota na ktoru je produkt zlavneny .. teda ak stal 400€: value = 400, a zlavnil sa na 350€: value_discount = 350 dve tricka nemozu mat rovnake product_id .. ale jedno tricko moze mat rozne farby a rozne velkosti - cize napriklad 2 farby a 2 velkosti = 4 odlisne ceny ale produkt to je stale ten isty
uplne vsetko = informacie ktore potrebujem pre vypis produktov + informacie o cene ku kazdemu produktu v jednom selecte .. cize v tomto tvojom pripade to je vsetko naraz
//edit: a ked to spravim takto ako ty, tak to vytiahne iba tie produkty ktore maju ceny kedze ich joinujes a pouzivas where na joinutu tabulku ... cize z produktov sa vytiahnu iba tie produkty u ktorych je nejaka cena ... a ja potrebujem vybrat vsetky produkty .. a ak tam ziadna cena nieje tak vypisat "nieje na sklade" (ak nemam pravdu tak ma opravte)
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
To mas pravdu... zatial ma nikto neopravil, tak mi nenapada nic rozumnejsie ako: Kód: SELECT p.product_id, p.name, MIN(x.value) FROM products p LEFT JOIN (SELECT product_id, value, value_discount FROM prices WHERE available IS NOT NULL) x ON p.id = x.product_id GROUP BY p.product_id, p.name ORDER BY MIN(x.value)
|
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
to som vobec nemyslel na ten left join .. myslim ze by to malo fungovat .. aj na to ako to skutocne usporiadat podla ceny a zlavnenej ceny som uz prisiel ... davam tu cely moj select .. neviem kde mam chybu ale vsade mam value=NULL a value_discount=NULL tiez (to usporiadanie s limitom 1 na ceny funguje spravne): Kód: SELECT a.`product_id`, pr.`value`, pr.`value_discount` FROM (`products` a) LEFT JOIN ( SELECT `product_id`, `value`, `value_discount` FROM (`prices`) ORDER BY (CASE WHEN `value_discount` > 0 AND `value_discount` < `value` THEN `value_discount` ELSE `value` END) asc LIMIT 1 ) pr ON `a`.`product_id`=`pr`.`product_id` ORDER BY (CASE WHEN pr.`value_discount` > 0 AND pr.`value_discount` < pr.`value` THEN pr.`value_discount` ELSE pr.`value` END) asc // Spojený príspevok Štv 08.05.14 22:47ak dam iba ten vnoreny select na jeden produkt tak to cenu vyberie normalne Kód: SELECT `product_id`, `value`, `value_discount` FROM (`prices`) WHERE `product_id`=25561 ORDER BY (CASE WHEN `value_discount` > 0 AND `value_discount` < `value` THEN `value_discount` ELSE `value` END) asc LIMIT 1
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
Ten limit som nepochopil, na co tam mas - ked ho das prec, tak vysledok uz bude lepsi, aj ked to este nie je to, co by si chcel... Mozes sa inspirovat trebars aj tymto kodom: Kód: SELECT p.*, MIN(IF(pr.value_discount = 0, pr.value, LEAST(pr.value, pr.value_discount))) AS min_value FROM products AS p LEFT JOIN prices AS pr USING(product_id) GROUP BY p.product_id ORDER BY min_value Produkty bez ceny budu sice prve, ale to sa da tiez v pohode vyriesit.
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
ten limit je na to aby vybralo iba jednu cenu po usporiadani a to tú prvú ... Kód: SELECT `product_id`, `value`, `value_discount` FROM (`prices`) WHERE `product_id`=25561 ORDER BY (CASE WHEN `value_discount` > 0 AND `value_discount` < `value` THEN `value_discount` ELSE `value` END) asc LIMIT 1 cize vysledok bez limitu budu napriklad 3 cieny usporiadanych podla: Kód: ORDER BY (CASE WHEN `value_discount` > 0 AND `value_discount` < `value` THEN `value_discount` ELSE `value` END) asc a LIMIT mi vyberie skutocne tu najnizsiu pricom v tom ORDER BY beriem ohlad na to ze zlava moze byt nizsia ako obycajna cena [0] value=70, value_discount=50 <----- LIMIT 1 [1] value=60, value_discount=0 [2] value=75, value_discount=0 v tom tvojom kode ja nepotrebujem vybrat najnizsiu ... potrebujem aj nepotrebujem ... v podstate ma vobec najnizsia hodnota nezaujima ... zaujima ma cely riadok v PRICES kde je najnizsia cena pre ten dany produkt a to ci uz je to hodnota `value` alebo `value_discount` a potrebujem dostat obe tieto hodnoty .. z tvojho kodu dostanem iba min_value a to mi nestaci ... z toho riadku kde je min_value potrebujem dostat este dalsie stlpce .. a myslim ze tvojim kodom obe tie hodnoty presne z jedneho riadku nedostanem pomocou MIN .. vies mi poradit inak ? .. to riesenie co som tu postol naposledy .. nvies preco mam vsade NULL pri cenach ked ten select v joine vracia presne 1 vysledok ?
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
Myslel som ten limit, ktory mas v prvom selecte, nie ten, ktory je urceny pre konkretny produkt s id 25561. Pretoze v tomto pripade ti to vyberie vzdy rovnaky riadok - to je aj dovod, preco mas vo vysledku okrem jedneho produktu vsade hodnotu NULL // Spojený príspevok Pia 09.05.14 13:33Tak potom som ta nepochopil, lebo som vychadzal z tohto: DeeJay3 píše: Ako vybrať všetky produkty a pre každý produkt najnižšiu cenu aj ked by cenu žiadnu nemal alebo by žiadna nebola available ??? + usporiadať ich podla ceny Ak teda potrebujes vybrat riadok, ktory obsahuje najnizsiu cenu pre kazdy produkt, tak skus toto: Kód: SELECT p.name, pr1.* FROM prices AS pr1 INNER JOIN ( SELECT product_id, MIN(IF(value_discount = 0, value, LEAST(value, value_discount))) AS min_value FROM prices GROUP BY product_id ) AS pr2 ON pr1.product_id = pr2.product_id AND (pr1.value = pr2.min_value OR pr1.value_discount = pr2.min_value) RIGHT JOIN products AS p ON p.product_id = pr1.product_id GROUP BY pr1.product_id ORDER BY min_value
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
a co ak su tam dve rovnake ceny (dve kombinacie farba-velkost ktore stoja rovnako) .. jedna kombinacia sa predava druha nie .. a do vypisu chcem vytiahnut tu ktora sa predava ... teda available='1' a iba keby tam nebola ziadna available tak by to vytiahlo tu ktora sa nepredava .. riadit ten join podla min_value nieje velmi uzitocne .. riesi to problem ale len z casti // Spojený príspevok Uto 03.06.14 15:45Citácia: ...aj ked by cenu žiadnu nemal... toto neplati .. vytahujem iba produkty, ktore maju nejaku cenu 1. vsetky produkty ktore maju nejaku cenu (ceny usporiadat najprv podla toho ci je available=1 .. potom ceny usporiadat podla toho ci je value_discount<value - teda ci tam je zlava .. a z tychto usporiadanych cien vybrat iba tu prvu) 2. produkty usporiadat podla pozicie alebo nazvu alebo ceny alebo ..
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
Nechapem, aky problem to riesi len ciastocne? Ak tam chces zaradit len tie produkty, ktore sa predavaju, tak tam tu podmienku jednoducho uvedies. Skusal si to vobec?
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
samozrejme ze skusal .. a hovorim ze to funguje fajn .. ale ako hovorim riesi to problem len ciastocne .. co ak maju dve kombinacie rovnaku cenu ? a ja chcem vybrat tu kombinaciu pri ktorej je zlava ? alebo co ak maju rovnaku cenu a ja chcem vybrat tu kde je zlava .. a ak je v obidvoch pripadoch zlava napriklad na 60€ tak chcem uprednostnit tu ktora je na sklade .. napriklad .. rozumies mi ?
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
Nemozes ocakavat, ze jeden sql prikaz vychadzajuci z predoslych poziadaviek na funkcnost zvladne vsetko, na co si spomenies neskor, ze by to mohlo robit. Teraz si prisiel s nejakymi novymi podmienkami, tak sa ich tam pokus zapracovat, nie je to nic zlozite.
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
praveze si to napisal tak ze sa tam uz doplnit nic neda .. s dalsou funkcionalitou som uz ludi zatazovat neplanoval .. ale dal si mi take riesenie kde to vobec doplnit nejde .. aj ked by som to do tej podmienky v selecte doplnil (ktora je v inner joine) tak ak by dve kombinacie mali rovnaku cenu je velmi pravdepodobne ze to vytiahne prave tu ktora nesplna podmienky .. stacilo by ze sa cena = min_value .. na zaklade tejto hodnoty to robit nemozem .. nieje to jednoznacne :| .. vazne som necakal ze to vyriesim takto .. predstavu som mal, ale nie takuto
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
Ok, aby sme sa niekam konecne pohli, pre lepsie porozumenie by si mohol vysledok, ktory chces dosiahnut, uviest na priklade: Kód: price_id 1 2 3 4 5 6 7 product_id 1 1 1 2 2 2 3 value 10 20 15 30 15 20 10 value_discount 0 10 10 20 0 15 5 available 1 1 0 1 1 0 0 Co ma byt konecnym vystupom selectu a preco?
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
teraz to mam spravene takto (ale nemozem tie produkty usporiadat podla ceny): myslim ze to pochopis z tohto zapisu Kód: $this->db->select('a.product_id, a.name'); $this->db->from('prices p'); $this->db->join('products a', 'p.product_id=a.product_id', 'left');
$this->db->group_by('p.product_id');
if ($order=='date') { $this->db->order_by('UNIX_TIMESTAMP(a.date) asc'); $this->db->order_by('a.product_id asc'); } elseif ($order=='name') { $this->db->order_by('a.name asc'); } else { $this->db->order_by("(CASE WHEN a.sorter is null THEN 1 ELSE 0 END) asc"); $this->db->order_by('a.sorter asc'); $this->db->order_by('a.product_id asc'); }
$products = $this->db->get()->result_object();
foreach ($products as $product) { $this->db->select('pr.value, pr.value_discount'); $this->db->from('prices pr'); $this->db->where('pr.product_id', $product->product_id);
$this->db->order_by("(CASE WHEN pr.available is null THEN 1 ELSE 0 END) asc"); $this->db->order_by("(CASE WHEN pr.`value_discount` > 0 AND pr.`value_discount` < pr.`value` THEN pr.`value_discount` ELSE pr.`value` END) asc"); $this->db->order_by("(CASE WHEN pr.`value_discount` > 0 AND pr.`value_discount` < pr.`value` THEN 0 ELSE 1 END) asc");
$this->db->limit(1);
$product->price = $this->db->get()->row_object(); } vyber tej spravnej ceny pre kazdy produkt sa robi tu podla usporiadania: Kód: $this->db->order_by("(CASE WHEN pr.available is null THEN 1 ELSE 0 END) asc"); $this->db->order_by("(CASE WHEN pr.`value_discount` > 0 AND pr.`value_discount` < pr.`value` THEN pr.`value_discount` ELSE pr.`value` END) asc"); $this->db->order_by("(CASE WHEN pr.`value_discount` > 0 AND pr.`value_discount` < pr.`value` THEN 0 ELSE 1 END) asc");
$this->db->limit(1); cize z tej tabulky co si poslal usporiadanie v krokoch bude: najprv tie ktore available=1 -----> price_id 1 2 4 5 3 6 7 potom podla tej druhej podmienky (usporiadat podla ceny .. ak je value_discount pouzit value_discount namiesto ceny) -----> price_id 1 2 5 4 7 3 6 a potom podla 3 podmienky (ak su rovnake ceny uspriadaj podla toho ci ma zlavu) ------> price_id 2 1 5 4 7 3 6 a $this->db->limit(1); vyberie iba tu price_id = 2 .. pretoze je available .. je najnizsia a je to zlava potom som tam este chcel doplnit dalsie podmienky .. napriklad ak vsetko maju rovnake aby to vybralo tu ktora je na sklade (to by bola 4 podmienka): Kód: $this->db->order_by("(CASE WHEN pr.availability = 'in-stock' THEN 0 ELSE 1 END) asc"); pripravil som nejake test data: http://sqlfiddle.com/#!8/56704pre product 25330 by to mala byt price_id=128 pre product 25331 by to mala byt price_id=130 pre product 25332 by to mala byt price_id=137 pocitam aj s tou 4 podmienkou ci je tovar na sklade
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
Vyskusaj toto, mohlo by to fungovat, pripadne si to este uprav podla potreby: Kód: SELECT p.name, pr.* FROM products AS p INNER JOIN ( SELECT * FROM ( SELECT * FROM prices ORDER BY available DESC, LEAST(value, IF(value_discount = 0, ~0, value_discount)), value_discount DESC ) AS tmp GROUP BY product_id ) AS pr USING(product_id)
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
na tie skusobne data to funguje tak ako ma .. vyskusam aj realne .. vies mi prosim ta vysvetlit co znamena ta tilda (~) pred nulou v podmienke IF ?
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
~ neguje vsetky bity v cisle
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 28.02.09 Prihlásený: 19.02.18 Príspevky: 241 Témy: 56 | 56 |
sevas chcem sa ti este raz podakovat funguje to tak ako som potreboval .. velmi si mi pomohol !! DAKUJEM
|
|
Stránka: 1 z 1
| [ Príspevkov: 19 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Ostatné | 8 | 716 | 12.12.2016 13:04 Koro36 | | v Video programy | 3 | 593 | 12.08.2010 20:17 ac.milan | | v Obchody, reklamácie a právo | 0 | 624 | 13.01.2012 18:06 reincarnate | | v PHP, ASP | 6 | 654 | 13.10.2008 15:33 emer | | v Redakčné systémy | 3 | 440 | 03.10.2013 20:19 shaggy | | v Obchody, reklamácie a právo | 2 | 1309 | 16.03.2007 17:12 Nun | | v Redakčné systémy | 1 | 568 | 29.11.2011 20:29 shaggy | | [ Choď na stránku: 1, 2 ] v Jedlo, pitie a varenie | 34 | 4884 | 31.05.2012 22:06 emer | | v Redakčné systémy | 0 | 668 | 09.09.2016 16:47 Hamaid | | v Ostatné | 9 | 806 | 11.06.2008 20:47 Blackdevil | | v Ponuka práce | 3 | 1599 | 26.06.2018 12:57 Miso122 | | v JavaScript, VBScript, Ajax | 3 | 351 | 25.12.2013 15:07 shaggy | | v Chladiče a všetky druhy chladenia | 5 | 1858 | 20.10.2006 17:09 ScorpionSX | | v Mobilné zariadenia | 5 | 568 | 17.08.2012 9:14 EndersoN | | v Notebooky a netbooky | 3 | 539 | 07.09.2017 20:17 pepkopav | | v Assembler, C, C++, Pascal, Java | 26 | 1036 | 28.03.2017 21:15 BX |
|