Le schéma:
J'ai 3 tableaux:Requête complexe avec des tables connexes - Solution optimale
- utilisateur
- Feature
- User_has_Feature:
initialement tous les utilisateurs n'a pas caractéristiques
données Exemple:
utilisateur:
| id | name |
| 1 | Rex |
| 2 | Job |
Feature:
| id | name |
| 1 | Eat |
| 2 | Walk |
User_has_Feature:
| id | user_id | feature_id | have_feature |
| 1 | 1 | 1 | true |
| 2 | 1 | 1 | true |
| 3 | 2 | 2 | true |
| 4 | 2 | 2 | false |
Les questions sont les suivantes:
- ¿Comment obtenir uniquement les enregistrements qui ont toutes les fonctionnalités? (explicitement)
Exemple:
| user_name | feature_name | feature_status |
| Rex | Eat | true |
| Rex | Walk | true |
- Comment obtenir des enregistrements qui ne sont pas toutes les fonctionnalités? (Encore une fois explicitement)
Exemple:
| user_name | feature_name | feature_status |
| Job | Eat | true |
| Job | Walk | false |
Certaines conditions doivent être assisté
- J'ai besoin la liste des utilisateurs avec toutes les fonctionnalités (vrai ou faux) dans les deux requêtes comme des exemples
- L'utilisateur ont 650k enregistrements (pour l'instant)
- Fonctionnalités ont 45 enregistrements (pour l'instant)
- Est une requête de temps.
L'idée est d'exporter le résultat vers un fichier CSV
précoce Solution
grâce aux réponses (@RolandoMySQLDBA, Ingram @ Tom, @DRapp) J'ai trouvé une solution :
SELECT u.name, f.name, IF(uhf.status=1,'YES','NO') as status
FROM user u
JOIN user_has_feature uhf ON u.id = uhf.user_id
JOIN feature f ON f.id = uhf.feature_id
JOIN
(
SELECT u.id as id
FROM user u
JOIN user_has_feature uhf ON uhf.user_id = u.id
WHERE uhf.status = 1
GROUP BY u.id
HAVING count(u.id) <= (SELECT COUNT(1) FROM feature)
) as `condition` ON `condition`.id = u.id
ORDER BY u.name, f.id, uhf.status
pour obtenir des enregistrements qui ne sont pas toutes les fonctionnalités et obtenir tous les enregistrements qui ont toutes les caractéristiques changent:
WHERE uhf.status = 1
parWHERE uhf.status = 2
HAVING count(u.id) <= (SELECT COUNT(1) FROM feature)
parHAVING count(u.id) = (SELECT COUNT(1) FROM feature)
mais je veux savoir si cela est une solution?
Le 'UNF.FeatureList' d'où vient – rkmax
Désolé pour UNF. Le H et N sont l'un à côté de l'autre sur le clavier. – RolandoMySQLDBA