---
title: "Ta fram storsäljare"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/96324-ta-fram-storsäljare"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "icaaq"
published: "2004-02-02T08:49:12.000Z"
updated: "2004-02-02T10:37:19.000Z"
replies: 13
views: 306
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/96324-ta-fram-storsäljare"
---

# Ta fram storsäljare

## #1 — icaaq, 2004-02-02T08:49Z

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

Permalänk: https://www.webforum.nu/p/96324

## #2 — LarsG, 2004-02-02T09:22Z

```
select product_id from 
from cart 
order by sum(quantity)  desc
limit 1
```

Permalänk: https://www.webforum.nu/p/1264513

## #3 — OveRRidE, 2004-02-02T09:31Z

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. ;)

Permalänk: https://www.webforum.nu/p/1264515

## #4 — icaaq, 2004-02-02T09:33Z

Jag får **Invalid use of group function** :(

mv icaaq

Permalänk: https://www.webforum.nu/p/1264518

## #5 — icaaq, 2004-02-02T09:36Z

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 **p**rimary **k**ey

mv icaaq

Permalänk: https://www.webforum.nu/p/1264520

## #6 — OveRRidE, 2004-02-02T09:40Z

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

Permalänk: https://www.webforum.nu/p/1264521

## #7 — LarsG, 2004-02-02T09:50Z

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
```

Permalänk: https://www.webforum.nu/p/1264528

## #8 — icaaq, 2004-02-02T09:59Z

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

Permalänk: https://www.webforum.nu/p/1264532

## #9 — LarsG, 2004-02-02T10:03Z

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.

Permalänk: https://www.webforum.nu/p/1264534

## #10 — icaaq, 2004-02-02T10:09Z

> 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

Permalänk: https://www.webforum.nu/p/1264535

## #11 — OveRRidE, 2004-02-02T10:13Z

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.

Permalänk: https://www.webforum.nu/p/1264539

## #12 — icaaq, 2004-02-02T10:18Z

Hur hade du gjort OveRRide?

mv icaaq

Permalänk: https://www.webforum.nu/p/1264542

## #13 — OveRRidE, 2004-02-02T10:33Z

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

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

RED. FK = Foreign Key

Permalänk: https://www.webforum.nu/p/1264543

## #14 — OveRRidE, 2004-02-02T10:37Z

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.

Permalänk: https://www.webforum.nu/p/1264546

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/96324-ta-fram-storsäljare
