2010-08-08 5 views

Répondre

16

Vous avez besoin d'un alias pour la sous-requête, et vous avez besoin d'appliquer les conditions soit aux deux questions que vous union:

SELECT MAX(DateTime) 
FROM (

    SELECT DateTime 
    FROM Class_Searches 
    WHERE User_Email = '[email protected]' 
    AND DateTime > NOW() - INTERVAL 30 DAY 

    UNION ALL 

    SELECT DateTime 
    FROM Book_Searches 
    WHERE User_Email = '[email protected]' 
    AND DateTime > NOW() - INTERVAL 30 DAY 

) AS x 

ou renvoyer des données afin que vous puissiez appliquer la condition dans la requête externe:

SELECT MAX(DateTime) 
FROM (

    SELECT DateTime, User_Email 
    FROM Class_Searches 

    UNION ALL 

    SELECT DateTime, User_Email 
    FROM Book_Searches 

) AS x 
WHERE User_Email = '[email protected]' 
AND DateTime > NOW() - INTERVAL 30 DAY 
1

Un alias est Lorsque vous renommez quelque chose, comme SELECT t.time from table t, t est l'alias de cette table. Dans ce cas, vous devez donner un alias aux tables générées par les sous-requêtes:

SELECT MAX(ut.DateTime) 
FROM (
(
    SELECT DateTime 
    FROM Class_Searches 
) cs 
UNION ALL (
    SELECT DateTime 
    FROM Book_Searches 
) bs 
) ut 
WHERE User_Email = '[email protected]' 
AND ut.DateTime > NOW() - INTERVAL 30 DAY 

Cela ne fonctionne toujours pas bien, parce que vous ne disposez pas d'une colonne user_email retourné de l'Union. Ainsi, essayez:

SELECT MAX(ut.DateTime) 
FROM (
(
    SELECT DateTime, User_Email 
    FROM Class_Searches 
) cs 
UNION ALL (
    SELECT DateTime, User_Email 
    FROM Book_Searches 
) bs 
) ut 
WHERE ut.User_Email = '[email protected]' 
AND ut.DateTime > NOW() - INTERVAL 30 DAY 

Il est possible que cela ne fonctionne toujours pas juste à cause de la syntaxe UNION, mais au moins il est beaucoup plus proche.

+0

-je obtenir cette erreur avec la seconde requête: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'bs ) ut O ut ut.User_Email =' [email protected] ' ET ut.DateTime> MAINTENANT() - INTER' à la ligne 10 – babonk

Questions connexes