Šta je novo?

Pomoć pri sastavljanu SQL upita

jddipqd

Čuven
Učlanjen(a)
17.10.2000
Poruke
2,555
Poena
725
Imam dve tabele: orders (PK(order_id), email) i orders_items (PK(order_item_id), FK(order_id), item_id)

Imam jedan item_id. Treba da napravim upit koji će da vrati x najpopularnijih itema koje su naručivali ljudi koji su naručivali item item_id, i koliko puta su naručivani.
Kontam da bi trebalo ovako nekako: vidim kome orderu pripada dati item_id, grupišem ordere po emailu, za svaku grupu ordera prebrojim iteme, saberem količine istih itema iz svih grupa, i vratim x itema sa najvećom količinom.
Ali ne ide mi baš da pretočim to u jednu sql rečenicu.

Baza je SQL Server 2000.
 
Evo nesto cisto iz glave neisprobano (mrzi me sad da pravim tabele da bi isprobao):

Kod:
SELECT TOP 10 oi.item_id, count(*) FROM orders o, orders_items oi
WHERE o.order_id = oi.order_id
AND o.order_id IN 
(
	[COLOR="SeaGreen"]-- svi orderi tj. emailovi koji su narucili zadati_item_id[/COLOR]
	SELECT o.order_id FROM orders o, orders_items oi
	WHERE o.order_id = oi.order_id
	AND oi.item_id = zadati_item_id
)
GROUP BY oi.item_id
ORDER BY 2 DESC
 
Alternativno mozes select top 10 ...
da zamenis sa
select oi.item_id... ORDER BY 2 DESC LIMIT 10
(Nisam nikad radio sa SQL Server 2000, pa ako slucajno ne podrzava top)
 
Alternativno mozes select top 10 ...
da zamenis sa
select oi.item_id... ORDER BY 2 DESC LIMIT 10
(Nisam nikad radio sa SQL Server 2000, pa ako slucajno ne podrzava top)

SQL server podrzava TOP, a LIMIT ne podrzava.

Kod:
// mysql
select col from tbl limit 20;

// Oracle
select col from tbl where rownum<=20;

// Microsoft SQL
select top 20 col from tbl;
 
Hvala!

Zaboravio sam da naglasim da mi treba da se računaju samo jedinstveni itemi koje je naručio jedan čovek, ali taj deo sam sam dodao...

Ako nekome nekad zatreba:
Kod:
DECLARE @item_id INT

SET @item_id = 26

SELECT TOP 10 i.item_id, COUNT(i.item_id) AS how_many
FROM (
	SELECT DISTINCT oi.item_id, o.e_mail
	FROM orders_items oi
	INNER JOIN orders o
	ON oi.order_id = o.order_id
	WHERE oi.order_id IN (
		SELECT o.order_id FROM orders o
		INNER JOIN orders_items oi
		ON o.order_id = oi.order_id
		WHERE oi.item_id = @item_id
	)
	AND NOT oi.item_id = @item_id
) i
GROUP BY i.item_id
ORDER BY how_many DESC
 
Mislim da ste malo zakomplikovali sa tim where ... in select ...

Zapravo nije komplikacija ali mi se cini da postoji brze resenje.

Evo nekog pseudo SQL koda (da ne pisem db specific)

select oi2.item_id, count(oi2.item_id) // naravno top 10

order_items oi1 join orders o on (oi1.item_id=:id and oi1.order_id=o.order_id) join order_items oi2 on (o.order_id=oi2.order_id /* and oi2.item_id<>oi1.item_id - ukoliko zelis striktno razlicite iteme od onog ciji id imas*/)

// naravno i group by 1 order by 2 desc

Svakako bi bilo interesantno uporediti koji pristup je brzi
 
Poslednja izmena:
Mislim da ste malo zakomplikovali sa tim where ... in select ...
Zapravo nije komplikacija ali mi se cini da postoji brze resenje.

Meni licno je uvek lakse da razmisljam preko sub select-a nego join na istu tabelu. To bas ne mogu inicijalno da drzim u glavi kad resavam problem. Sub Select mi je jednostavnije. Znam da sub select odradi posao i onda ga gledam samo kao rezultate pa onda razmisljam o glavnom select-u.

A sta je brze stvarno ne znam i mislim da zavisi od slucaja do slucaja. Koliko podataka u kojem selectu, koja baza je u pitanju i sl. Moguce je i da baza izvrsi transformaciju upita pa da se svedu na isto.
 
Vrh Dno