PDA

Pogčedajte punu verziju : Problem oko sortiranja proizvoda, za dve cene!


martinluter
10. 09. 2010., 16:21
Polja u bazi za cene su
CENA - za upis regularne cene
CENA1 - za upis akcijske cene
Imam listu proizvoda, npr njih 100
i ako npr 3 od tih proizvoda imaju i regularnu cenu i akc. cenu (npr duplo manu od regularne).
Prilikom izlistavanja i sortiranja npr sa "ORDER BY cena ASC" izlista mi sve proizvode od najmanje cene ka najvisoj, zanemarujuci akc. cenu za tri proizvoda.
Proizvodi sa akc. cenama bi trebali da budu postavljeni u blizini proizvoda cija je regularna cena priblizna akcijskoj ceni.
Sa ovim jednostavnim upitom koji sadrzi samo ORDER BY cena ASC, sortira i proizvode na akciji po njihovoj staroj ceni.

Kako da ovo malo iskomplikujem, odnosno da ukljucim i akcijsku cenu u sortiranje i da postavi odredjeni proizvod po vrednosti akc. cene?

vidak
10. 09. 2010., 17:14
Dodaš u upitu if(reg_cena < auk_cena, reg_cena, auk_cena) as prava_cena
Select *, if(reg_cena < auk_cena, reg_cena, auk_cena) as prava_cena from proizvod ORDER BY prava_cena DESC;

kalkulus
10. 09. 2010., 17:26
ako sam te dobro razumeo ovako neshto bi trebalo da ti radi posao

SELECT *, GREATEST(cena, cena1) as max_cena FROM proizvodi ORDER BY max_cena ASC

ivanhoe
10. 09. 2010., 17:49
^^ treba valjda LEAST() ?

mada tu ima problem jer ako nije setovana cena1 onda je ili 0 ili NULL i bice ispred one gde je vrednost setovana..


ja bih to ovako:
SELECT *, IFNULL(cena1, cena) AS trenutna_cena FROM proizvodi ORDER BY trenutna_cena

uz pretpostavku da je u tabeli cena1 DEFAULT NULL

martinluter
10. 09. 2010., 20:56
Hvala vam na odgovorima!

probao sam:

$pr=mysql_query("SELECT *, LEAST(cena,cena1>0) as max_cena FROM proizvodi WHERE akt='Y' ORDER BY max_cena DESC");


i


$pr=mysql_query("SELECT *, GREATEST(cena, cena1) AS trenutna_cena FROM proizvodi_new WHERE akt='Y' ORDER BY trenutna_cena ASC LIMIT $Start1,$ByPage1");



I jedno i drugo rade kad probam kod mene na localhostu, sa manjim brojem upisa, ali na severu gde je veci broj upisa, preko 100, ne zavrsi mi posao, ne znam zato.

Ovo sto je @ivanhoe predlozio, probao sam da postavim da po defaultu ako nema cene1 da bude NULL, ali nisam uspeo da nateram da radi (ovo sa IFNULL) dok ovo sa LEAST() sam pokrenuo, kao sto sam napisao.


Konkretno se radi o ovom slucaju:
http://www.inelektronic.com/proizvodi/bela_tehnika__36/ves_masine__44.html/-4-24/
Videcete gde je naniza akc. cena 27.990,00 ali je proizvod postavljen medju ostalim proizvodima gde je cena oko 29 hiljade

jablan
10. 09. 2010., 21:04
Pogledaj funkciju COALESCE.

ivanhoe
10. 09. 2010., 21:52
koja je baza u pitanju? jel mysql i koja verzija?

ja sam upravo probao i meni lepo sortira...

martinluter
10. 09. 2010., 22:09
Baza je MySQL, a verzija: Верзија MySQL клијента: 5.0.67 (kod mene na kompu)
Preuzeo sam i sve upise sa servera i prebacio u localhost bazu i sto se ponasa kako i na serveru.

Ovako otprilike izgleda tabela:

CREATE TABLE IF NOT EXISTS `proizvodi` (
`id` int(10) NOT NULL auto_increment,
`naslov` varchar(200) collate utf8_unicode_ci default NULL,
`opis` text collate utf8_unicode_ci,
`slika` varchar(50) collate utf8_unicode_ci default NULL,
`datum` date NOT NULL default '0000-00-00',
`akt` char(1) collate utf8_unicode_ci NOT NULL default '',
`cena` float(20,2) NOT NULL,
`cena1` float(20,2) default NULL,
`nalageru` int(1) NOT NULL,
`katid` int(10) NOT NULL,
`br_pregleda` int(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `katid` (`katid`),
KEY `idfirme` (`idfirme`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3120 ;

Da ne zeza nesto sto je za cene postavljeno FLOAT, a ne INT?

ivanhoe
10. 09. 2010., 22:37
izbacio sam iz tabele sva nebitna polja, ostavio samo id, cena i cena1 da bi bilo jasnije:

-- dodao neke proizvode, 2 proizvoda su na akciji i imaju snizenu cenu
INSERT INTO `proizvodi` (cena, cena1) values (1,NULL),(3,NULL),(5.50, NULL),(9, NULL),(15, 9.95),(10, 7.25),(25, NULL);

mysql> select * from proizvodi;
+----+-------+-------+
| id | cena | cena1 |
+----+-------+-------+
| 1 | 1.00 | NULL |
| 2 | 3.00 | NULL |
| 3 | 5.50 | NULL |
| 4 | 9.00 | NULL |
| 5 | 15.00 | 9.95 |
| 6 | 10.00 | 7.25 |
| 7 | 25.00 | NULL |
+----+-------+-------+
7 rows in set (0.00 sec)

-- i sad kad pozovem onaj upit:
mysql> SELECT *, IFNULL(cena1, cena) AS trenutna_cena FROM proizvodi ORDER BY trenutna_cena;
+----+-------+-------+---------------+
| id | cena | cena1 | trenutna_cena |
+----+-------+-------+---------------+
| 1 | 1.00 | NULL | 1.00 |
| 2 | 3.00 | NULL | 3.00 |
| 3 | 5.50 | NULL | 5.50 |
| 6 | 10.00 | 7.25 | 7.25 |
| 4 | 9.00 | NULL | 9.00 |
| 5 | 15.00 | 9.95 | 9.95 |
| 7 | 25.00 | NULL | 25.00 |
+----+-------+-------+---------------+
7 rows in set (0.00 sec)



sto je ono sto i treba da se dobije, ako sam ja dobro razumeo sta ti hoces (trenutna cena je cena na akciji ako postoji, inace je osnovna cena, i po tome sortiramo od najmanje ka najvecoj)

ovo je na windowsu, server version: 5.1.40-community MySQL Community Server (GPL)

martinluter
10. 09. 2010., 23:13
Da, u pravu si bio @ivanhoe, radi ovo.
Hvala ti!
Primenio sam ovo sto si ti napisao na zeljenoj tebeli na localhostu, kad sam vrednosti za cena1 0.00 setova u NULL, tad je proradilo.

Samo sad mi se javlja problem, ne mogu na serveru, na sajtu da postavim NULL umesto 0.00, pa mi zato ne radi.

U svakom slucaju hvala ti!