Jag skulle lagra kategorierna och valen i olika tabeller. Sedan en relationstabell för att knyta val till en användare. Typ:
val_kategori
kat_id - kat_namn
0 - Favoritfärg
1 - Favorithusdjur
val_alternativ
alt_id - kat_id - alt_namn
0 - 0 - Röd
1 - 0 - Grön
2 - 1 - Groda
3 - 0 - Rosa
4 - 1 - Hund
val_rel
rel_id - user_id - alt_id
0 - 5 - 2
1 - 5 - 3
Understrukna fältnamn är primärnycklar. Val_kategori lagrar ett unikt id för varje kategori samt namnet på kategorin. Val_alternativ lagrar ett unikt id för varje valalternativ, vilken kategori alternativet tillhör samt en sträng med alternativet. Val_rel lagrar relationen och innehåller användarens id samt ett valalternativ. Du behöver inte lagra kategori-id't här, det kan du joina in.
I exemplet ovan gillar användare 5 rosa och grodor.
Det kan du få ut med en fråga som:
SELECT u.namn AS namn, k.kat_namn AS kat, a.alt_namn AS alt, u.user_id AS user_id
FROM users u
LEFT JOIN val_rel r ON r.user_id = u.user_id
INNER JOIN val_alternativ a ON a.alt_id = r.alt_id
INNER JOIN val_kategori k ON k.kat_id = a.kat_id
WHERE u.user_id = 5;
Då skulle du få ut följande från exemplet ovan...
[B]namn kat alt user_id[/B]
Petter Favorithusdjur Rosa 5
Petter Favoritfärg Groda 5
Om du ändrar användare-id't till 6 så kanske det ser ut så här: (Användare 6 har inte valt några favoriter alls)
[B]namn kat alt user_id[/B]
Amina null null 6
Då får du ut null för kat och alt, då det inte finnas något att hämta där. Detta pga att den första joinen är en left join. Hade man satt en inner join hade du fått ut ett resulset med 0 rader för användare 6.
