MySQL, joina användartabell på flera kolumner i samma rad?

Permalänk
Medlem

MySQL, joina användartabell på flera kolumner i samma rad?

Ok, jag har användartabell (Users) som innehåller bland annat följande kolumner:

UserID
UserName
UserPoints
osv
osv

Jag har även en feed tabell i databasen där ja, som sparar tex "JesperA kommenterade JesperB's bild".

feed tabell raderna ser typ ut såhär:

FeedID = (autoinc)
FeedItemID = 233 (ID:t på typ bilden eller bloggen eller whatever feed händelsen är gjord till)
FeedUserID1 = 33 (UserID:t på personen kommenterade något skit eller gjorde något, JesperA i exemplet ovan)
FeedUserID2 = 1723 (UserID:t för JesperB)

Innan körde jag denormaliserat så hade både FeedUserName1 & FeedUserName2 i databasen, alltså
"JesperA" respektive "JesperB", men nu när jag skall köra typ nästan normaliserat så behöver
jag ju joina på både FeedUserID1 & FeedUserID2 i samma rad till "UserID" i min "Users" tabell.

Jag har alltid varit superlat och nästan alltid kört denormaliserat på denna typen av tabeller, extra utrymmet har aldrig spelat någon roll då mina dataset har varit ganska små, men nu är det snart 10 miljoner rader så det är inte längre överdrivet försvarbart att köra denormaliserat. Men som sagt, eftersom jag alltid varit så lat tidigare så har jag ingen erfarenhet av just detta problemet, joins är inga problem men multipla joins där flera kolumner skall till samma tabell, njaaa.

Så någon som vet hur man löser detta enklast?

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem

Hej

Prova att använda dig av en subquery.
ex.

select FeedID, (select UserName from Users where UserId = FeedUserID1) as JesperA, (select UserName from Users where UserId = FeedUserID2) as JesperB from Feeds

Något åt det hållet, du fattar säkert.

Permalänk
Medlem

Eller prova att använda GROUP_CONCAT vilket ser ut att vara exakt det du behöver

Permalänk
Medlem

Det är bara att fortsätta joina inga problem

SELECT F.FeedID, U1.UserName UserName1, U2.UserName UserName2 FROM FEEDS F JOIN Users U1 ON F.FeedUserID1 = Users.UserID JOIN Users U2 ON F.FeedUserID2 = Users.UserID

O.s.v. skrivet det rakt i luften så ganska säkert någon lite tabbe.

Det sagt. dina tabeller är ju inte normaliserade här heller, sedan har du idiotiska namn om jag ska vara ärlig..... UserID1???? UserID2??? Vad är det? Säger en person inte ett skvatt. Försök namnge de bättre så man förstår på en gång vad det handlar om eller hyfsat handlar om.

Så ja... för att vara ärlig.... så beskrev du att FeedItemID innehåller vilken bild o.s.v. det är då innehåller den garanterat vilken användare den tillhör så använd den för att få fram rätt användare. Spara inte samma information på två ställen bara för att du tycker det är jobbigt att skriva lite mer kod, du ökar chansen till problem o.s.v i framtiden, lathet är inte bra här.

Så gör om gör rätt Ta BORT FeedUserID2 Och skriv om det till något liknande detta ( jag vet inte vad dina kolumner heter så gissar )

SELECT F.FeedID, U.UserName UserName1, FIU.UserName UserName2 FROM FEEDS F JOIN Users UON F.FeedUserID1 = Users.UserID JOIN FeedItemID FI ON F.FeedItemID = FI.ID JOIN Users FIU ON FI.UserId = Users.UserID

Försök att alltid jobba mot 3dje gradens normalisering som bas, därefter kan du välja att gå mer eller inte mer, men mindre en tredje gradens normalisering är oftast inte bra så länge du inte har anledning för det. http://www.databasteknik.se/webbkursen/normalisering/

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift