Kom ihåg mig?
Home Menu

Menu


MySQL: Para ihop medlemmar 2 & 2?

 
Ämnesverktyg Visningsalternativ
Oläst 2014-06-30, 17:04 #1
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
Standard MySQL: Para ihop medlemmar 2 & 2?

Tja!

Har ett litet problem som blev krångligare än vad jag tänkt, antingen det eller så har jag tillfällig hjärnblödning för jag kommer inte ihop något smart & effektivt sätt att lösa detta på för enda sättet jag kommer på resulterar i en otroligt mängd queries, jag måste ha missat något.

Har kollat runt lite men nja:
http://stackoverflow.com/questions/1...pair-two-users
http://stackoverflow.com/questions/1...pairs-in-mysql


Iaf, jag vill para ihop medlemmar 2 & 2 bland medlemmar som har anmält sig till ett evenemang.

Har en användardatabas, förenklar grovt nu & tar bara med dom relevanta kolumnerna:

Tabellen Users
UserID BIGINT auto_increment
UserGender TINYINT (1 = man, 2 = kvinna)
UserCity SMALLINT (använder kommunkoder så City är lite missvisande men spelar ingen roll)



Tabellen EventUsers
EventID BIGINT auto_increment
EventUserID (sparar UserID för varje person som anmält sig till eventet)
EventGender (gender i detta fallet är inte anmälarens UserGender utan vilket gender som anmälaren önskas paras ihop med, kan lämnas tom)
EventCity (samma här, det är inte anmälarens UserCity utan det är vilken stad som anmälaren önskas paras ihop med)


Tabellen EventMatches (för att spara paren så dom 2 inte kan paras ihop igen eller med andra)
MatchID BIGINT auto_increment
MatchUser1ID BIGINT (ja detta är bara pseudonamn änsålänge)
MatchUser2ID BIGINT (ja detta är bara pseudonamn änsålänge)

Både tabell EventUsers & EventMatches rensas efter varje event

Det som ställer till det är att jag måste kunna matcha ihop 2 användare inom samma matchnings kriterier, hade inte kriterierna funnits, EventGender & EventCity så hade jag ju kunnat göra det lätt för mig och bara slumpa ihop 2 & 2 från EventUsers tabellen, men det kan jag ju inte nu.

Jag kan ju lösa det genom att loopa igenom alla EventID & köra 1 query på Users databasen för varje EventUsers deltagare för att para ihop 2 st med kriterier som passar varandra & sen lägg in resultatet i en annan tabell (EventMatches), en rad för varje par matchning. detta fungerar, & det är så jag gör tillfälligt nu, MEN om jag skulle få 1000 deltagare i eventet så blir det ju 1000 queries mot Users+join mot EventMatches tabellen. Vilket är långt, långt ifrån optimalt.


Så ja, ett smartare sätt att lösa detta på? Ni behöver inte slänga upp massa kod osv utan det räcker att ni pekar mig mot rätt riktning

Senast redigerad av JesperA den 2014-06-30 klockan 17:07
JesperA är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-06-30, 17:40 #2
ANttila ANttila är inte uppkopplad
Medlem
 
Reg.datum: Aug 2013
Inlägg: 81
ANttila ANttila är inte uppkopplad
Medlem
 
Reg.datum: Aug 2013
Inlägg: 81
Kanske en query för varje kön, sätt ett "par ID" för varje rad. Sen UNION på "par ID"?
ANttila är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-01, 15:41 #3
rhdf rhdf är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2006
Inlägg: 359
rhdf rhdf är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2006
Inlägg: 359
Ett alternativ skulle väl vara att plocka ut alla deltagare till en array som du sen loopar igenom och jämför med "sig själv" för att göra matchningen. I den loopen bygger du ihop en stor query som du sen kör . (insert into matches(.. ..) Values (.. ..), (.. ..) osv )

När du hittar matchningar så plockar du helt enkelt bort de 2 deltagarna ur arrayen. Kvar har du sen de som inte valt några preferenser.
rhdf är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-01, 15:46 #4
Alexs avatar
Alex Alex är inte uppkopplad
Administratör
 
Reg.datum: Sep 2004
Inlägg: 1 621
Alex Alex är inte uppkopplad
Administratör
Alexs avatar
 
Reg.datum: Sep 2004
Inlägg: 1 621
Hur ofta behöver du köra detta, och hur lång tid tar frågan som den ser ut nu?
__________________
@Zn4rK - Börja blogga - Paintball i Göteborg
Det jag skriver är mina personliga åsikter och återspeglar inte vad WN eller andra företag jag representerar tycker.
Alex är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-01, 19:32 #5
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
1000 tupler i en SQL-fråga verkar vara "peanuts", har du prestandaproblem?
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-01, 20:37 #6
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
Tack så mycket för svaren allihopa.

Säg till om jag skall slänga ihop en databas + PHP kod om någon tycker det är roligt att leka runt lite :P

Citat:
Ursprungligen postat av ANttila Visa inlägg
Kanske en query för varje kön, sätt ett "par ID" för varje rad. Sen UNION på "par ID"?
Kanske missuppfattande men ser tyvärr inte hur detta hjälper mitt problem för jag måste ändå kors matcha paren så användare #1 kön & stad passar in på användares #2 önskemål när det gäller kön & stad, MEN det räcker ju inte att #1 kan paras ihop med #2, #2 kön & stad måste också passa in på #1 önskemål. Det är just korsmatchningen som gör att det tar ett par queries för att matcha ihop dom.

Citat:
Ursprungligen postat av rhdf Visa inlägg
Ett alternativ skulle väl vara att plocka ut alla deltagare till en array som du sen loopar igenom och jämför med "sig själv" för att göra matchningen. I den loopen bygger du ihop en stor query som du sen kör . (insert into matches(.. ..) Values (.. ..), (.. ..) osv )

När du hittar matchningar så plockar du helt enkelt bort de 2 deltagarna ur arrayen. Kvar har du sen de som inte valt några preferenser.
Ja så skulle jag också kunna göra, men det är ändå bara en annan version av det jag redan har, är det 1000 deltagare så måste jag loopia igenom arrayen minst 500ggr & max 1000ggr beroende på om den hittar par matchningar eller inte. Kan ju använda Redis istället för just arrayen och bortplockningen av deltagarna från arrayen så blir det något mindre prestandaproblem men jao hmm.


Citat:
Ursprungligen postat av Alex Visa inlägg
Hur ofta behöver du köra detta, och hur lång tid tar frågan som den ser ut nu?
Evenemangen är 1ggr i veckan & 1 omgång per event. Detta kan komma att ändras till 1 ggr i veckan & upp till 20 omgångar beroende på popularitet. Frågan tar mellan 5-10s per 1´000 deltagare (loopar igenom 1000 deltagare, korsmatchar med 1 query per deltagare + insert av matchningen) så minst 1000st queries för 1000 deltagare :P Kan maskera dom 5-10s med en eventloader iofs: "Eventet börjar om 20s" + nedräkning & köra querien under tiden, men är viss aktivitet på andra delar av sidan också som blir påverkare/köade under tiden vilket inte är så optimalt.

Citat:
Ursprungligen postat av Conny Westh Visa inlägg
1000 tupler i en SQL-fråga verkar vara "peanuts", har du prestandaproblem?
1000 rader år såklart en fis i rymden, problemet är dom 1000-1500 ytterligare SQL-frågor det resulterar i.
JesperA är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-01, 23:22 #7
rhdf rhdf är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2006
Inlägg: 359
rhdf rhdf är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2006
Inlägg: 359
Citat:
Ursprungligen postat av JesperA Visa inlägg
Ja så skulle jag också kunna göra, men det är ändå bara en annan version av det jag redan har, är det 1000 deltagare så måste jag loopia igenom arrayen minst 500ggr & max 1000ggr beroende på om den hittar par matchningar eller inte.
Ja, men du slipper 1000 anrop till databasen, vilket jag uppfattade var ditt största problem.
rhdf är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-02, 10:56 #8
Alexs avatar
Alex Alex är inte uppkopplad
Administratör
 
Reg.datum: Sep 2004
Inlägg: 1 621
Alex Alex är inte uppkopplad
Administratör
Alexs avatar
 
Reg.datum: Sep 2004
Inlägg: 1 621
Släng ihop en databas med PHP så kan vi kolla lite
__________________
@Zn4rK - Börja blogga - Paintball i Göteborg
Det jag skriver är mina personliga åsikter och återspeglar inte vad WN eller andra företag jag representerar tycker.
Alex är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-02, 11:57 #9
lubic lubic är inte uppkopplad
Medlem
 
Reg.datum: Aug 2005
Inlägg: 205
lubic lubic är inte uppkopplad
Medlem
 
Reg.datum: Aug 2005
Inlägg: 205
Detta kan kanske fungera, eller inte
Dock helt otestat (då jag inte har tabeller och eller data) samt att det inte finns stöd för att EventGender kan vara tomt, så det måste läggas på lite mer logik för att få till det, om resten nu mot förmodan fungerar.

select * from
(
select u.UserID userID1, u2.UserID, userID2

from EventUsers eu
join Users u on u.UserID = eu.EventUserID

join EventUsers eu2 on eu2.EventUserID != eu.EventUserID
AND eu2.EventGender = u.UserGender AND eu2.EventCity = u.UserCity

join Users u2 on u2.UserID = eu2.EventUserID
AND u2.UserGender = eu.EventGender
AND u2.UserCity = eu.EventCity

order by RAND()
) group by userID1

Men som sagt, det är otestat och jag är långt i från säker på vilket (om något) resultat som kommer ut.
Men testa och se om det kanske är en väg framåt?
lubic är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-07-02, 12:18 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Om TS kan bidra med lite DDL kod (CREATE) för tabeller och nycklar samt lite INSERTS med testdata så kanske fler orkar göra mer tester. Det blir för mycket jobb om alla ska bygga allt från scratch.... i alla fall för mig....
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 14:45.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017