Avatar billede bongii Nybegynder
08. april 2008 - 13:37 Der er 6 kommentarer og
1 løsning

Forslag til forespørgsel

Hej.

Jeg har 2 tabeller.

Tabel1: Users
Kolonne: UserID, Name

Tabel2: UserInterests
Kolonner: ID, UserID, InterestsID

Der findes 20 forskellige interesser i Tabel2. Det er ikke alle brugere der har interesser. Nogle har 20, andre har 3.

Hvordan kan jeg lave et smart udtræk, således jeg får et recordset med UserId, InterestID1, InterestID2, OSV.

Har prøvet med; select a.userID, a.name, b.userId, b.interestsID from users as a, userinterests as b where a.userId = b.userId and a.UserID = 1;,
men det giver mange kolonner:

userID    name    interestsID
58475    Jesper    17
58475    Jesper    16
58475    Jesper    15
58475    Jesper    14

Kan man ikke få udskrevet:

userID    name    userId    interestsID_1  interestsID_2 
58475    Jesper    58475    17              0

Osv.
Avatar billede hrc Mester
08. april 2008 - 14:10 #1
Kan du ikke håndtere det som en samling records? Det er jo sådan man har tænkt sig SQL-databaser at fungere. At oprette et variabelt antal felter i resultatsættet har aldrig været meningen.

Du ender i sådan noget som nedenstående og det er ikke kønt.

select u.userid, u.name, ui01.id, ui02.id, ui03.id, ui04.id, ui05.id, ...
  from user u
  left join userinterests ui01 on (ui01.userid = u.userid and ui01.id = 1)
  left join userinterests ui02 on (ui02.userid = u.userid and ui02.id = 1)
  left join userinterests ui03 on (ui03.userid = u.userid and ui03.id = 1)
  left join userinterests ui04 on (ui04.userid = u.userid and ui04.id = 1)
Avatar billede lorentsnv Nybegynder
08. april 2008 - 14:13 #2
Du kan løse dit problem ved brug af PIVOT funktionen.

Her er et eksempel fra AdventureWorks:

USE AdventureWorks;
GO
SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS Emp4, [233] AS Emp5
FROM
(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [164], [198], [223], [231], [233] )
) AS pvt
ORDER BY VendorID


Resultatet bliver:
VendorID    Emp1        Emp2        Emp3        Emp4        Emp5
1          4          3          5          4          4
2          4          1          5          5          5
3          4          3          5          4          4
4          4          2          5          5          4
5          5          1          5          5          5
Avatar billede bongii Nybegynder
08. april 2008 - 14:30 #3
Hrc: Databasen bliver MEGA stor hvis jeg gør det.
Lorentsnv: Kigger lige på dit eksempel.

Jeg har lige prøvet: (Jeg tror det er noget af det rigtige)
SELECT a.userid,a.name,(SELECT DISTINCT b.InterestsID FROM UserInterests as b WHERE a.userid = b.UserID)
FROM users as a where a.userId = 58475;

Men jeg får dette svar:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Avatar billede HenrikSjang Nybegynder
08. april 2008 - 20:37 #4
Jeg vil bestemt også mene at PIVOT er vejen frem.

Problemet med den sidste stump sql du har sendt er, at din sub-select jo returnerer 4 rækker hvis brugeren har 4 interesser. Du vil i så fald skulle gøre noget i den her stil (hvilket er MEGET grimt... gør hellere end indsats for PIVOT løsningen)

SELECT
  a.userid,a.name,
  (SELECT b.InterestsID FROM UserInterests as b WHERE a.userid = b.UserID
  AND b.InterestsId = 1) AS Interesse_1,

  (SELECT b.InterestsID FROM UserInterests as b WHERE a.userid = b.UserID 
  AND b.InterestsId = 2) AS Interesse_2,

  (SELECT b.InterestsID FROM UserInterests as b WHERE a.userid = b.UserID
  AND b.InterestsId = 2) AS Interesse_3,
  ... osv op til så mange forskellige interesseId'er der nu kan findes
FROM users as a where a.userId = 58475;

Der vil altså skulle laves en subselect for HVER interesseid der findes, og nogle af dem vil så returnere en række, og nogle vil ikke (hvis ikke den konkrete bruger har den pågældende interesse).
Avatar billede bongii Nybegynder
09. april 2008 - 14:13 #5
Jeg har rodet MEGET med det nu.

Jeg kan ikke se sammenhængen i PIVOT funktionen.

Forstår ikke hvorfor det er så bøvler. Jeg har bare 2 tageller. Det må være noget med select i select.

Tabel1: Users
Kolonne: UserID, Name

Tabel2: UserInterests
Kolonner: ID, UserID, InterestsID
Avatar billede bongii Nybegynder
09. april 2008 - 16:01 #6
Sjang: Jeg har brugt dit forslag. Det er et cronjob der kører én gang i døgnet, så det må gerne tage lidt tid. Smider du et svar?
Avatar billede HenrikSjang Nybegynder
09. april 2008 - 17:02 #7
Jamen det gør jeg da så :)

der er heller ikke så meget mening i at få produceret noget kode man selv slet ikke forstår. Det gør bare vedligeholdelsen meget mere bøvlet... og så må man jo vurdere om det man får lavet er "good enough", hvilket du så i denne situation har vurderet :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester