ugrás a tartalomhoz

Növekvő árak szerint listázás

sanyoo · 2011. Ápr. 25. (H), 23.32
Sziasztok.
(egyszerűsített példa): adot az árúk(productid) árait(price) tároló tábla(price_test), az árak meghatározásainak időpontjaival(datetime)

CREATE TABLE `price_test` (
  `id` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
  `productid` mediumint(9) unsigned NOT NULL,
  `price` mediumint(9) unsigned NOT NULL,
  `datetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
);	

INSERT INTO `price_test` (`id`, `productid`, `price`, `datetime`) VALUES
(1, 1, 4, '2011-04-14 17:20:05'),
(2, 1, 44, '2011-04-14 17:21:14'),

(3, 2, 6, '2011-04-14 17:20:05'),
(4, 2, 5, '2011-04-14 17:44:27'),

(5, 3, 7, '2011-04-14 17:20:05'),
(6, 3, 50, '2011-04-14 17:58:47'),
(7, 3, 70, '2011-04-14 17:20:57');
Ki szeretném listázni (jelenlegi) árak szerint nővekvő sorrendben a terméket. És ezt ha meglehet oldani akkor egymásba ágyazott selectek nélkül.

id    productid  price 	   datetime
4     2          5 	   2011-04-14 17:44:27
2     1          44 	   2011-04-14 17:21:14
6     3          50        2011-04-14 17:58:47
szeretném kapni.

SELECT 
 *
FROM
  price_test 
GROUP BY 
  productid
HAVING 
  max(datetime)
ORDER BY 
  price ASC
lenne számomra az "logikus" megoldás..
 
1

minek bonyolítani?

ironwill · 2011. Ápr. 26. (K), 09.40
SELECT * FROM price_test ORDER BY price ASC

(sajnos a mutatott kód és a kérdésed nincs összhangban, ezért nem teljesen világos, hogy ténylegesen mit szeretnél..)
3

select-es kódomat

sanyoo · 2011. Ápr. 26. (K), 16.48
select-es kódomat felejtsd el. (csak azért írtam ide, hogy lássátok hogy próbálkoztam:))

Minden árúnak a legújabb árát szeretném listázni, majd ezt szeretném rendezni.
Vagyis a példánál maradva három sort kapjak vissza, (1, 2, 3- as árút)

második oszlop (productId) szerint kénne csoportosítani, majd azok közül kiválasztani a nagyobb dátumú sort.
(1, 1, 4, '2011-04-14 17:20:05')
(2, 1, 44, '2011-04-14 17:21:14')

(3, 2, 6, '2011-04-14 17:20:05')
(4, 2, 5, '2011-04-14 17:44:27')

(5, 3, 7, '2011-04-14 17:20:05')
(6, 3, 50, '2011-04-14 17:58:47')
(7, 3, 70, '2011-04-14 17:20:57')

Igen sajnos szükségem van a régi árakra is. és ha egy mód van rá akkor akkor ne ezen a ponton legyen redunáns az adatbázis.
5

Sajnos belső SELECT mentes

ironwill · 2011. Ápr. 27. (Sze), 00.41
Sajnos belső SELECT mentes megoldást én sem tudok prezentálni.. :)
SELECT *
FROM price_test 
WHERE datetime in (
  SELECT max(datetime)
  FROM price_test
  GROUP BY productid
)
ORDER BY price
2

Könnyebben megoldhatod ezt a

Ifju · 2011. Ápr. 26. (K), 14.57
Könnyebben megoldhatod ezt a problémát, ha a termékeid adatait tartalmazó táblában eltárolod az éppen aktuális árát a terméknek.
4

Sajnos van benne subselect, de hátha

Franczen Attila · 2011. Ápr. 26. (K), 23.03
Hátha mégis jó lesz így is neked.

MSSQL alatt teszteltem, de szerintem mysql alatt is mennie kell.

SELECT p1.id,p1.productid, p1.price, p1.datetime
FROM price_test p1
RIGHT JOIN
(
SELECT p2.productid, MAX(p2.datetime) AS ds
FROM price_test p2
GROUP BY p2.productid
) AS p3
ON p1.datetimes = p3.ds
6

Én így csinálnám SELECT

bb0072 · 2011. Ápr. 27. (Sze), 10.41
Én így csinálnám

SELECT view.*
FROM (
    SELECT
	*
    FROM 
	price_test			
    ORDER BY datetime DESC
    ) AS view
GROUP BY view.productid
7

köszönöm

sanyoo · 2011. Ápr. 28. (Cs), 10.19
Mindannyitoknak köszönöm a segítséget!

végül ezt választottam mert ez 150ezer soros táblát is átnyálazz belátható időn belül. (~0.5s)
Ha belassul akkor majd felbontom a normálformát és felveszek egy plusz boolean oszlopot (price_active).
8

kíváncsiság

ironwill · 2011. Ápr. 28. (Cs), 13.10
Azért azt megkérdezhetem, hogy a mi sql-ünk mennyire volt "lassú"? Csak kíváncsiság.. :)
9

hát..

sanyoo · 2011. Ápr. 28. (Cs), 15.00
a válasz röviden: elégé.

hosszabban:
~5300 rekordnál a nyertes másodperc törtrésze alatt végzett, kódotok meg másodpercekig tekerte a db-t.
Viszont!
- másik táblára engedtem rá a kódokat. (irányítószám táblára, három oszloppal (id, postcode, cityname. Postcode szerint group by -oltam[productid helyett], cityName szerint kiválasztva a nagyobbat[datetime helyett], a végén meg cityName szerint rendezve [price] helyett.)

- phpMyAdminnal teszteltem... ami nem erre lett kitalálva...

- és ami fontos: annyira nagy különbség jött ki hogy simán lehet hogy valamit elnéztem a másik táblaszerkezetre átírása közben.

/*   
SELECT *  
	FROM postcode2  
	WHERE postcode_city in (  
		SELECT max(postcode_city)  
		FROM postcode2  
		GROUP BY postcode_postcode
	)  
ORDER BY postcode_city 
LIMIT 100
*/

/*
SELECT p1.postcode_id,p1.postcode_postcode, p1.postcode_city
FROM postcode2 p1  
	RIGHT JOIN  (  
		SELECT p2.postcode_id, MAX(p2.postcode_city) AS ds  
		FROM postcode2 p2  
		GROUP BY p2.postcode_postcode  
	) AS p3  
ON p1.postcode_city = p3.ds  
ORDER BY postcode_city ASC
LIMIT 100
*/

/*
SELECT view.*  
FROM (  
	SELECT  *  
	FROM postcode2           
	ORDER BY postcode_city DESC  
) AS view  
GROUP BY view.postcode_postcode
ORDER BY postcode_city ASC  
LIMIT 100
*/

11

:)

ironwill · 2011. Ápr. 28. (Cs), 16.08
Köszi a választ!
Nem vagyok egy db mágus, szóval elképzelhető, hogy amit írtam, az nem legoptimalizáltabb sql.. :)
10

ne felejtsd el..

carstepPCE · 2011. Ápr. 28. (Cs), 16.03
a megfelelo indexeket rarakni a tablakra, azzal szerintem meg lehet sokat gyorsitani a lekerdezesek sebessegen.