webForumDet fria alternativet

Group by vid sökfråga

Databaser & SQLur Databashanterare & SQL

5 svar · 243 visningar · startad av Erik Juhlin

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#1

Jag har problem med den här SQL-frågan. Den söker igenom en kategori och underliggande kategorier efter användare. Problemet är bara att samma användare kan finnas i flera kategorier (genom en referenstabell). Så när man söker får man upp samma användare flera gånger.

SELECT * FROM tblM_Address a
 INNER JOIN tblM_AddressReference r 
ON a.AddressId = r.AddressRefAddressId 
AND (r.AddressRefCategoryId = 3 OR r.AddressRefCategoryId IN (12,16,13,15,14,17,19))
 WHERE AddressSiteId = 4 
AND AddressXModuleId = 276
 AND (AddressFirstName LIKE '%erik%' 
OR AddressLastName LIKE '%erik%' 
OR AddressCompany LIKE '%erik%' 
OR AddressPhone LIKE '%erik%' 
OR AddressMobile LIKE '%erik%' 
OR AddressEmail LIKE '%erik%' 
OR AddressHomePage LIKE '%erik%' 
OR AddressStreet LIKE '%erik%' 
OR AddressZipCode LIKE '%erik%' 
OR AddressCity LIKE '%erik%' 
OR AddressCountry LIKE '%erik%' 
OR AddressComment LIKE '%erik%')
 ORDER BY AddressFirstName

Jag försökte slänga in en GROUP BY AddressId i mellanrummet.

Men då får jag en massa såna här meddelanden:

Server: Msg 8120, Level 16, State 1, Line 1
Column 'a.AddressXModuleId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Och snälla, gör inte om frågan alltför mycket eftersom att jag då måste gå in och ändra den VB-koden som genererar den här SQL:en. Och jag vill gärna slippa ändra allt.

Tack på förhand... :)

Redigerat för att öka läsbarheten /Lars

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#2

Skrev så här nu, vilket ju funka, men är en helt hemsk lösning.

SELECT AddressId, AddressXModuleId, AddressSiteId, AddressFirstName, AddressLastName, AddressCompany, AddressPhone, AddressMobile, 
AddressEmail, AddressHomePage, AddressStreet, AddressZipCode, AddressCity, AddressCountry, AddressCreationDate 
FROM tblM_Address a
 INNER JOIN tblM_AddressReference r 
ON a.AddressId = r.AddressRefAddressId 
AND (r.AddressRefCategoryId = 3 OR r.AddressRefCategoryId IN (12,16,13,15,14,17,19))
 WHERE AddressSiteId = 4 
AND AddressXModuleId = 276
 AND (AddressFirstName LIKE '%erik%' 
OR AddressLastName LIKE '%erik%' 
OR AddressCompany LIKE '%erik%' 
OR AddressPhone LIKE '%erik%' 
OR AddressMobile LIKE '%erik%' 
OR AddressEmail LIKE '%erik%' 
OR AddressHomePage LIKE '%erik%' 
OR AddressStreet LIKE '%erik%' 
OR AddressZipCode LIKE '%erik%' 
OR AddressCity LIKE '%erik%' 
OR AddressCountry LIKE '%erik%' 
OR AddressComment LIKE '%erik%')
 GROUP BY AddressId, AddressXModuleId, AddressSiteId, 
AddressFirstName, AddressLastName, AddressCompany,
 AddressPhone, AddressMobile, AddressEmail, 
AddressHomePage, AddressStreet, AddressZipCode, 
AddressCity, AddressCountry, AddressCreationDate
 ORDER BY AddressFirstName

Hoppas någon kan komma med en smidigare! :)

Redigerat för att öka läsbarhet/Lars

LarsGMedlem sedan dec. 200012 464 inlägg
#3

Varför vill du ha med group by? Som det är nu så är din fråga samma som om du hade använt select distinct.

PS: Skriv inte så långa rader.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#4

Aha, SELECT DISTINCT AddressId, AddressXModuleId o.s.v. ?

Men jag vill liksom använda SELECT *...

Och sen är det AddressId som ska vara unikt.

LarsGMedlem sedan dec. 200012 464 inlägg
#5

Nu när det går att läsa ditt inlägg så frågar jag mig varför du har så många olika adresskolumner. Jag skulle lägga det separat,

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Varför är det problem om du får upp samma adressid flera gånger? Det är ju väldigt mycket enklare att gruppera ihop det på klientsidan än att göra det i SQL (i de flesta fall.)

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