Votre base de données n'est pas dans le département first normal form. Une base de données non normalisée sera très problématique à utiliser et à interroger, comme vous le faites actuellement.
En général, vous devriez utiliser au moins la structure suivante. Il peut encore être normalisée plus loin, mais j'espère que cela vous arrive d'aller dans la bonne direction:
CREATE TABLE users (
user_id int,
name varchar(100)
);
CREATE TABLE users_needs (
need varchar(100),
user_id int
);
Ensuite, vous devez stocker les données comme suit:
-- TABLE: users
+---------+-------+
| user_id | name |
+---------+-------+
| 1 | joe |
| 2 | peter |
| 3 | steve |
| 4 | clint |
+---------+-------+
-- TABLE: users_needs
+---------+----------+
| need | user_id |
+---------+----------+
| housing | 1 |
| water | 1 |
| food | 1 |
| housing | 2 |
| rent | 2 |
| water | 2 |
| housing | 3 |
+---------+----------+
Notez comment la table users_needs
définit la relation entre un utilisateur et un ou plusieurs besoins (ou pas du tout, comme pour le numéro de l'utilisateur 4.)
pour normaliser votre base de données plus loin, vous devez également utiliser une autre table appelée needs
, et comme suit:
-- TABLE: needs
+---------+---------+
| need_id | name |
+---------+---------+
| 1 | housing |
| 2 | water |
| 3 | food |
| 4 | rent |
+---------+---------+
Ensuite, la table users_needs
devrait simplement se référer à un candidate key de la table needs
au lieu de répéter le texte.
-- TABLE: users_needs (instead of the previous one)
+---------+----------+
| need_id | user_id |
+---------+----------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 1 | 2 |
| 4 | 2 |
| 2 | 2 |
| 1 | 3 |
+---------+----------+
Vous pouvez également être intéressé à vérifier l'article de Wikipedia suivant pour plus lire sur la répétition des valeurs à l'intérieur des colonnes:
MISE À JOUR:
Pour répondre pleinement à votre question, si vous suivez les directives ci-dessus, le tri, le comptage et l'agrégation des données devraient alors devenir directs.
Pour trier le jeu de résultats en fonction des besoins, vous seriez en mesure de faire ce qui suit:
SELECT users.name, needs.name
FROM users
INNER JOIN needs ON (needs.user_id = users.user_id)
ORDER BY needs.name;
Vous aussi pouvoir compter combien de besoins de chaque utilisateur a sélectionné, par exemple:
SELECT users.name, COUNT(needs.need) as number_of_needs
FROM users
LEFT JOIN needs ON (needs.user_id = users.user_id)
GROUP BY users.user_id, users.name
ORDER BY number_of_needs;
C'est une mauvaise conception de base de données. Vous ne devez pas créer de champs SQL ayant une structure interne. –
Oui, c'est un mauvais design mais il est possible d'obtenir le résultat désiré. Quel DB utilisez-vous? Ajoutez les tags appropriés pour attirer l'attention des spécialistes de votre base de données. Certains DB ont un SQL récursif et/ou ont des fonctions spéciales. – redcayuga