Vinnaren i pepparkakshustävlingen!
2010-11-24, 15:08
  #1
Medlem
Hej,

Jag har följande tabeller:
Kod:
------------------------------
Packages
------------------------------
ID          Title          Price

------------------------------
Modules
------------------------------
ID          Title          Price

------------------------------
Package_Modules
------------------------------
Package_Id         Module_Id         Price         Position

------------------------------
Customers
------------------------------
Id

------------------------------
Customer_Modules
------------------------------
Customer_Id         Module_Id         Price



I min Windows-applikation vill jag lista alla moduler för en kund enligt ordningen från kolumnen Position i Package_Modules-tabellen.

Såhär ser min SQL-fråga ut för att lista alla modulerna för denne kund (utan rätt ordning):
Kod:
SELECT m.Id, m.Title, m.Price, cm.Returned
FROM Modules m
INNER JOIN Customer_Modules
cm ON m.Id = cm.Module_Id
WHERE cm.Customer_Id = @Customer_Id

Jag har försökt att göra en INNER JOIN mot tabellen Package_Modules på flera olika sätt men jag får inte till det (det blir bland annat dubbletter i så fall).

Min fråga är alltså: Hur ska jag modifera min SQL-fråga så att jag kan få mina moduler för kunden att sorteras enligt Position-kolumnen och visas i samma ordning som dom gör när jag har denna SQL-fråga:
Kod:
SELECT m.Id, m.Title
FROM Modules m
INNER JOIN Package_Modules pm
ON m.Id = pm.Module_Id
WHERE pm.Package_Id = @Package_Id
ORDER BY pm.Position

Tack på förhand!
Citera
2010-11-24, 15:19
  #2
Medlem
gadzooxs avatar
.NET?


OnT: Testa detta
Kod:
SELECT m.Id, m.Title, m.Price, cm.Returned
FROM Modules m
INNER JOIN Customer_Modules cm ON m.Id = cm.Module_Id
INNER JOIN Package_Modules pm ON m.Id = pm.Module_Id
WHERE cm.Customer_Id = @Customer_Id
ORDER BY pm.Position
Citera
2010-11-24, 15:29
  #3
Medlem
Citat:
Ursprungligen postat av gadzoox
.NET?

OnT: Testa detta
Kod:
SELECT m.Id, m.Title, m.Price, cm.Returned
FROM Modules m
INNER JOIN Customer_Modules cm ON m.Id = cm.Module_Id
INNER JOIN Package_Modules pm ON m.Id = pm.Module_Id
WHERE cm.Customer_Id = @Customer_Id
ORDER BY pm.Position

Nej det fungerade inte, jag får dubbletter av varje modul. Det är SqlCe (Sql Server Compact) btw.
Citera
2010-11-24, 18:04
  #4
Medlem
Citat:
Ursprungligen postat av Softileraren
Nej det fungerade inte, jag får dubbletter av varje modul. Det är SqlCe (Sql Server Compact) btw.

Om du får dubletter låter det som om Module_Id inte är unik i Package_Modules (både package_id och module_id bildar tillsammans en primärnyckel), och då kan du naturligtvis få flera sorteringar/rader för ett Module_Id.

Om det är så, så är ju frågan hur du ska sortera om en kund har en module_id, och package_modules där sorteringen ligger släpper ifrån sig ett eller flera olika sorteringsindex för den.

Det känns som om vi måste veta både package_id och customer_id för att göra en sortering.

Annars får du göra din select med antagandet att högsta position för din module_id är vad du kan sortera efter.

(snor gadzoox's select)

Kod:
SELECT m.Id, m.Title, m.Price, max(pm.position) as pos
FROM Modules m
INNER JOIN Customer_Modules cm ON m.Id = cm.Module_Id
INNER JOIN Package_Modules pm ON m.Id = pm.Module_Id
WHERE cm.Customer_Id = @Customer_Id
group by m.Id, m_Title, m.Price order by pos
?
Citera
2010-11-24, 18:29
  #5
Medlem
Citat:
Ursprungligen postat av putrifier
Om du får dubletter låter det som om Module_Id inte är unik i Package_Modules (både package_id och module_id bildar tillsammans en primärnyckel), och då kan du naturligtvis få flera sorteringar/rader för ett Module_Id.

Om det är så, så är ju frågan hur du ska sortera om en kund har en module_id, och package_modules där sorteringen ligger släpper ifrån sig ett eller flera olika sorteringsindex för den.

Det känns som om vi måste veta både package_id och customer_id för att göra en sortering.

Annars får du göra din select med antagandet att högsta position för din module_id är vad du kan sortera efter.

(snor gadzoox's select)

Kod:
SELECT m.Id, m.Title, m.Price, max(pm.position) as pos
FROM Modules m
INNER JOIN Customer_Modules cm ON m.Id = cm.Module_Id
INNER JOIN Package_Modules pm ON m.Id = pm.Module_Id
WHERE cm.Customer_Id = @Customer_Id
group by m.Id, m_Title, m.Price order by pos
?

Tack, jag kom på lösningen direkt när jag läste ditt svar: Det känns som om vi måste veta både package_id och customer_id för att göra en sortering.

Jag hade inte berättat om alla tabellerna jag hade då jag inte trodde dom var nödvändiga, men när du skrev det där insåg jag att jag kunde lösa det direkt. Nedan följer min query:
Kod:
SELECT m.Id, m.Title FROM Modules m
INNER JOIN Customer_Modules cm
ON m.Id = cm.Module_Id
INNER JOIN Customers c
ON cm.Customer_Id = c.Id
INNER JOIN Assignments a
ON c.Assignment_Id = a.Id
INNER JOIN Package_Modules pm
ON m.Id = pm.Module_Id AND a.Package_Id = pm.Package_Id
WHERE cm.Customer_Id = @Customer_Id
ORDER BY pm.Position

Tack så mycket!
Citera
2010-11-24, 19:38
  #6
Medlem
DigGaNs avatar
Då problemet handlar om databaser flyttar vi tråden dit.
.NET -> Databaser
/Mod
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback