Kom ihåg mig?
Home Menu

Menu


Dela upp unika poster i kategorier

Ämnesverktyg Visningsalternativ
Oläst 2009-09-14, 11:54 #1
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Standard Dela upp unika poster i kategorier

Hej !
Har en tankenöt att lösa.

Jag har ett antal användare som själva kan välja ett antal kategorier.
Nu vill jag lista alla kategorier - med en användare från varje kategori - dock får en användare bara visas i en kategori samtidigt.

Exempel:
Kategorier : Bygg, Måleri, VVS, Utbildning
Användare :
Adam ( Bygg, Måleri )
Bertil ( Bygg, VVS )
Cecilia ( Måleri, Utbildning )
Denise ( Måleri, VVS )
Einar ( Bygg, Måleri, Utbildning )

Om jag själv sorterar dem är det inga problem, men hur kan jag göra det programmatiskt (PHP)?

Just nu har jag $categories med varje kategori som i sin tur innehåller $users med de användare som valt kategorin.
Jag tänkte loopa genom varje kategori , bygga upp ett index av användare, sedan sortera användarna efter "antal kategorier" och sedan beta av dem en efter en, så den som har flest kategorier kommer sist i listan efter som det är störst sannolikhet att den passar i godtycklig kategori....

Tänker jag fel ?
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-14, 22:52 #2
elofssons avatar
elofsson elofsson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jul 2004
Inlägg: 881
elofsson elofsson är inte uppkopplad
Mycket flitig postare
elofssons avatar
 
Reg.datum: Jul 2004
Inlägg: 881
Bör göras direkt i SQL-satsen. Titta på SELECT DISTINCT, HAVING och GROUP BY.
elofsson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-15, 10:17 #3
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Intressant... Tänker jag rätt?
Hämta alla kategorier, sedan SELECT DISTINCT user_id, cat_id FROM users WHERE cat_id IN ( $category_ids )
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-15, 11:36 #4
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Kod:
SELECT DISTINCT user_id, category FROM user_categories
Detta returnerar en rad för varje kategori och användare. Dvs. jag får tre poster för bygg, tre för måleri, två för VVS och två för utbildning.
Ett tag tänkte jag det var rätt väg att gå, men hur kan jag nu filtrera ut en från varje kategori?
Alternativet är att köra en query per kategori, SELECT user_id FROM user_categories WHERE cat_id = $kategori AND user_id NOT IN ( $tidigare_anvandare )
men då är problemet att "användarna" kan ta slut innan alla kategorier är loopade.
Funderar vidare ....
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-15, 12:18 #5
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Pröva select distinct user_id,category, group_concat(username,',') from tabell group by category
Group_concat() kan plocka ihop fältvärden i en sträng. Se upp bara för den inbyggda begränsningen på 1024 tecken, behöver du längre sträng måste du ändra i my.cnf.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-15, 12:23 #6
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Men hur hjälper det för alla user_id som är unika? jag vill bara ha fyra resultat, en per kategori, med en unik användare per resultat.
GROUP_CONCAT hjälper ju inte till där (eller?)
Tänkte det fanns nåt smart sätt, men det får nog tyvärr bli lite tung php-bearbetning...
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-15, 13:42 #7
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Group by category ger dig exakt en rad per kategori.
Men du vill ha en rad per användare, gruppera per användare då.

Hur vet du vilka kategorier en användare tillhör?

Du skriver $categories och $users vilket är uttryck för en variabel inom php, men sen får vi gissa om det är en kolumn eller tabell du syftar på.
OM du har dina värde i en tabell med kolumner för användarnamn och för kategori och du har flera rader med samma innehåll i användarnamn-kolumnen men olika i kategori-kolumnen, så får du ut en lista med en rad per användare och alla kategorier separerade med komma så här:
select användarnamn, group_concat(kategori,',') group by användarnamn

Om du har gjort på något annat sätt får du väl joina tabeller tills du får ihop all info i samma fråga.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-15, 14:32 #8
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Aha !
Tänkte inte alls på GROUP BY men det är ju klart att det blir bättre med GROUP BY cat_id.
Ursäkta otydligheten med mina php-variabler, men jag hänvisar oftast till resultatet från föregående fråga. Ex. $tidigare_anvandare motsvarar alla user_id som använts i föregående frågor...

Provar med GROUP BY, så får vi se hur det går...
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-15, 14:39 #9
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Resultat:
Kod:
[0]=>
  object(stdClass)#105 (2) {
    ["user_id"]=>
    string(2) "63"
    ["category"]=>
    string(2) "10"
  }
  [1]=>
  object(stdClass)#106 (2) {
    ["user_id"]=>
    string(2) "63"
    ["category"]=>
    string(2) "20"
  }
  [2]=>
  object(stdClass)#107 (2) {
    ["user_id"]=>
    string(2) "63"
    ["category"]=>
    string(2) "30"
  }
  [3]=>
  object(stdClass)#108 (2) {
    ["user_id"]=>
    string(2) "92"
    ["category"]=>
    string(2) "40"
  }
Som ni ser får jag ju "samma" användare på de tre första kategorierna.
Egentligen är ju resultatet rätt, om man ser till frågan, för det är fyra DISTINCT-a rader.
Jag vill att ett user_id inte får förekomma mer än en gång....
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-09-16, 12:29 #10
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Resultat av vad? Skriv din frågesats så slipper vi gissa, och skriv ut resultatet i tabellform istället för att dumpa objektet så blir det mycket lättare att läsa.
Magnus_A ä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 22:47.

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