FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Mycket flitig postare
|
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 ? |
||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Mycket flitig postare
|
Bör göras direkt i SQL-satsen. Titta på SELECT DISTINCT, HAVING och GROUP BY.
|
|||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Mycket flitig postare
|
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 ) |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Mycket flitig postare
|
Kod:
SELECT DISTINCT user_id, category FROM user_categories 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 .... |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
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. |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Mycket flitig postare
|
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... |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Klarade millennium-buggen
|
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. |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Mycket flitig postare
|
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... |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Mycket flitig postare
|
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" } 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.... |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Klarade millennium-buggen
|
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.
|
||
![]() |
![]() |
Svara |
|
|