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:
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)
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
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.
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).
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 :)
Synes godt om
Ny brugerNybegynder
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.