2010-03-12 23 views
0

j'ai une requête qui obtient une liste des e-mails qui ont souscrit à un essai de bulletin qui dure 30 jours ..
MYSQL - Requête pour vérifier contre autre table (difficile à expliquer ...)

$thirty = time() - 3024000; 

SELECT c.email 
    FROM tbl_clients AS c 
    JOIN tbl_clientoptions AS o ON o.client = c.id 
WHERE o.option = 'newsletter' 
    AND c.datecreated > $thirty 

Ce que je veux faire est de faire une vérification dans cette même requête afin qu'elle renvoie également les clients PLUS de 30 jours s'ils ont le tbl_clientoptions.option = 'trialoverride' (ie une ligne dans la table des options client avec la valeur "trialoverride")

TBL_CLIENTS table:

  • id
  • Nom
  • email
  • dateCreated

TBL_CLIENTOPTIONS table:

  • id
  • client
  • Option
+0

Sons comme vous voulez 'UNION' deux sélections ensemble, le second avec une jointure à TBL_CLIENTOPTIONS –

+0

la table d'options a des choses comme newsletter, matériel promotionnel, smsalerts, newsletter mensuelle, etc et a également une option pour trialoverride. Il existe plusieurs lignes en fonction des options cochées. S'il y a un client avec des alertes de newsletter et de SMS, il y aura deux lignes. Si nous décochons quelque chose, une ligne est supprimée. Ce que je veux faire est de sélectionner tous ceux qui ont une 'newsletter' cochée et qui ont moins de 30 jours, et tous ceux qui ont une 'newsletter' qui ont plus de 30 jours s'ils ont un 'trial trial' coché. Je peux probablement faire deux requêtes, mais espérais faire en un .. – Sam

Répondre

0

Que diriez-vous:

SELECT c.email 
    FROM tbl_clients AS c JOIN tbl_clientoptions AS o 
    ON o.client = c.id 
    WHERE (o.option = 'newsletter' AND c.datecreated > $thirty) 
    || o.option = 'trialoverride'; 
+0

Je pense que j'ai essayé, mais il est en conflit avec l'autre colonne 'option' (ie: la ligne ne peut pas égaler 'newsletter' et 'trialoverride' à en même temps) Est-ce vrai? – Sam

+0

Désolé, je n'ai pas vu ça. Je l'ai édité à ce que je pense devrait fonctionner à la place. Fondamentalement, déplacé le (s) autour d'un peu. – catfarm

0

Normalement juste une condition OR fera, a ajouté un DISTINCT si un même utilisateur utilisateur peut avoir à la fois l'état, retirer sinon:

SELECT DISTINCT c.email 
FROM tbl_clients c 
INNER JOIN tbl_clientoptions o ON (o.client = c.id) 
WHERE 
(o.option = 'newsletter' AND c.datecreated < $thirty) OR 
(o.option = 'trial override' AND c.datecreated > $thirty);