2012-10-29 7 views
2

Je dois rechercher les préférences d'e-mail pour les utilisateurs.La requête MYSQL renvoie le résultat vide

Cette table contient les types d'e-mails qu'un utilisateur peut recevoir, classés par catégorie.

email_preferences_categories 

+----------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name  | text    | YES |  | NULL |    | 
| overview | text    | YES |  | NULL |    | 
+----------+------------------+------+-----+---------+----------------+ 

Cette table contient leur préférence pour la réception de divers types. S'ils n'ont pas défini leurs préférences, cette table n'aura aucune ligne pour eux.

email_preferences 

+------------+---------------------------------+------+-----+---------+----------------+ 
| Field  | Type       | Null | Key | Default | Extra   | 
+------------+---------------------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned    | NO | PRI | NULL | auto_increment | 
| user_id | int(10) unsigned    | NO |  | NULL |    | 
| name  | text       | YES |  | NULL |    | 
| frequency | enum('Daily','Monthly','None') | YES |  | Daily |    | 
+------------+---------------------------------+------+-----+---------+----------------+ 

J'ai besoin de construire une requête Mysql, qui renvoie le nom et la fréquence correspondant aux préférences de messagerie pour un utilisateur donné.

SELECT name, frequency 
FROM email_preferences 
LEFT JOIN email_preferences_categories using (name) 
WHERE user_id = 42 

Où je rencontre des problèmes: Si l'utilisateur n'a pas défini ses préférences, cette requête ne renvoie aucune ligne. Je voudrais qu'il renvoie la valeur par défaut de 'Daily' pour les catégories d'e-mail qui manquent.

+0

où avez-vous besoin email_preferences_categories (nom de domaine est à la fois dans emaial_preferences et emaail_preferences_category)? Vous ne voulez pas obtenir les valeurs de la table des utilisateurs en premier? –

+0

J'ai besoin de mail_preferences_categories lorsque la table utilisateur est vide ou manque une entrée. –

Répondre

2

Remplacez LEFT JOIN par RIGHT JOIN.

... 
FROM email_preferences 
RIGHT JOIN email_preferences_categories 
... 

Ou bien vous pouvez échanger les tables autour de:

... 
FROM email_preferences_categories 
LEFT JOIN email_preferences 
... 

Ces deux options les deux font la même chose - vous assurer que vous obtenez toutes les lignes de email_preferences_categories même s'il n'y a pas de ligne correspondante dans email_preferences.

Vous devez également modifier la condition de jointure comme vous l'avez déjà remarqué.


Je voudrais revenir à la valeur par défaut de « Daily » pour les catégories de courrier électronique qui manquent.

Vous pouvez utiliser IFNULL:

SELECT name, IFNULL(frequency, 'Daily') AS frequency 
1

Cette requête n'a pas besoin d'une clause WHERE. Il a besoin d'un JOIN plus restrictif. Voici la requête complète combinée avec Mark Byers réponse ci-dessus.

SELECT email_preferences_categories.name, IFNULL(frequency, 'Daily') AS frequency 
FROM email_preferences_categories 
LEFT JOIN email_preferences 
    ON email_preferences.name = email_preferences_categories.name 
    AND user_id = 42; 
+0

+1 c'est correct. –

Questions connexes