webForumDet fria alternativet

Ta fram storsäljare

Databaser & SQLur Databashanterare & SQL

13 svar · 286 visningar · startad av icaaq

Medlem sedan okt. 20005 273 inlägg
Frågan#1

Hej
Jag vill ta fram vilken produkt som har sålts mest i en webshop som jag snickrat ihop.

Tabellerna ser ut så här.

[red]
[b]orders[/b]
pk_id
customer_id
----------------------

[b]cart[/b]
pk_id
customer_id
product_id
quantity
----------------------

[/red]

Det finns förstås mer tabeller än detta men jag tror att det är endast dessa som behövs för sqlfrågan.

Jag vill alltså ha ut ett product_id på den varan som sålts mest. Alla bekräftade ordrar finns i orders.

mv icaaq

Medlem sedan dec. 200012 464 inlägg
#2
select product_id from 
from cart 
order by sum(quantity)  desc
limit 1
Medlem sedan feb. 200112 078 inlägg
#3

Nu är det ju inte jag som är SQL-ninja häromkring så jag tvekar lite, men är verkligen den där frågan korrekt, LarsG? Två FROM efter varandra? Dessutom ligger väl (såsom jag förstod det) ordrarna i orders och inte i cart.

Dock, eftersom jag inte förstår vad pk_id är för kolumn, så lämnar jag detta till någon annan. ;)

Medlem sedan okt. 20005 273 inlägg
#4

Jag får Invalid use of group function :(

mv icaaq

Medlem sedan okt. 20005 273 inlägg
#5

Och som Override skriver så måste jag kolla om cart.customer_id finns i orders.customer_id.

pk_id är ett vanligt id som är satt till primary key

mv icaaq

Medlem sedan feb. 200112 078 inlägg
#6

Men.. jag förstår inte hur du binder orders till cart? Du har ju ingen Foreign Key till orders i cart. För jag antar att cart innehåller raderna som utgör en order?

RED. Inte använder du customer_id, väl? :o

Medlem sedan dec. 200012 464 inlägg
#7

Oops, det var ju helt feltänkt. Varför behövs orders i detta sammanhang?

select product_id,sum(quantity) as sold
from cart
group by product_id
order by sold desc
limit 1
Medlem sedan okt. 20005 273 inlägg
#8

Opps är det fel att använda orders.customer_id för att ta fram de bekräftade ordrarna?

När jag vill se ordrarna så gör jag så här

[red]
SELECT DISTINCT(orders.customer_id), customers.company
FROM orders, customers
WHERE orders.customer_id = customers.pk_id
[/red]

Är det fel? Det funkar ju ;)

mv icaaq

Medlem sedan dec. 200012 464 inlägg
#9

Det man kan anmärka på är

DISTINCT(orders.customer_id)

Distinct är ingen funktion och det appliceras alltid på alla värden i select-listan.

Medlem sedan okt. 20005 273 inlägg
#10

Varför behövs orders i detta sammanhang

För att där har jag de bekräftade ordrarna. Om inte customer_id ligger i orders så har inte kunden bekräftat ordern.

Så jag hur ska jag lägga in en where sats i din sista sqlfråga?

mv icaaq

Medlem sedan feb. 200112 078 inlägg
#11

Problemet med en customer_id som FK är att det binder upp alla rader i tabellen cart mot den order du väljer. Oavsett ifall det är två separata ordrar från samma användare.

Där har du ett stort designfel, enligt mig.

Medlem sedan okt. 20005 273 inlägg
#12

Hur hade du gjort OveRRide?

mv icaaq

Medlem sedan feb. 200112 078 inlägg
#13
[b]orders[/b]
----------------------
pk_id
customer_id

[b]cart[/b]
----------------------
pk_id
order_id [i]« FK mot orders.pk_id[/i]
session_id [i]« användares session.sessionId[/i]
customer_id
product_id
quantity

RED. FK = Foreign Key

Medlem sedan feb. 200112 078 inlägg
#14

Tillägg: alltså; sålänge inte en order är lagd av det som finns i korgen är alltså kolumnen cart.order_id NULL på de rader som är knytna till kunden. Varje rad i cart har session_id för att hålla koll på vilka rader som verkligen hör till den specifika besökarens tidsenliga besök. Om kunden lägger tre rosa bananer i korgen i februari, ångrar sig och inte raderar dem utan stänger webbläsaren, kommer han annars att få med sig sina rosa bananer nästa gång han besöker sidan, vilket kan vara lite förbryllande.

Vidare; så kallad limbodata i en cart-tabell är inte ovanligt, vilket borde förebyggas. Med customer_id kan du ta reda på vem som har lagt vad i korgen utan att radera det/köpa det, samt (om du har en date-kolumn) ta reda på när. Detta ger kanske upphov till statistik enligt vissa, men jag föredrar att hålla tabellen ren från sån data om man inte behöver den.

127 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)