2010-09-13 4 views
0

J'ai besoin d'un moyen approprié pour écrire une simple instruction WHERE, AND, OR. Celui-ci ne fonctionne pas:Instruction de sélection Mysql

SELECT `content` 
    FROM `bx_wall_events` 
WHERE `type` = 'wall_common_text' 
    OR `type` = 'wall_common_fb' 
    OR `type`= 'wall_common_tw' 
    AND `owner_id`='{$iId}' 
ORDER BY `date` DESC 
    LIMIT 1 

Répondre

5

C'est une déclaration valide, mais j'imagine que le problème est que les OR ne sont pas interprétés comme vous vous en doutez. Utilisez la syntaxe IN à la place:

SELECT content 
    FROM bx_wall_events 
    WHERE `type` IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw') 
    AND `owner_id` = '{$iId}' 
ORDER BY `date` DESC 
    LIMIT 1 

J'ai enlevé les backticks dans certains endroits parce qu'ils sont seulement nécessaires pour échapper les noms de colonnes tableau & qui utilisent MySQL reserved keywords.

La façon suivante:

WHERE `type` = 'wall_common_text' 
    OR `type` = 'wall_common_fb' 
    OR `type`= 'wall_common_tw' 
    AND `owner_id`='{$iId}' 

... évalue est:

WHERE (`type` = 'wall_common_text') 
    OR (`type` = 'wall_common_fb') 
    OR (`type`= 'wall_common_tw' AND `owner_id`='{$iId}') 
+0

Vous pouvez également placer des parenthèses autour des OR pour les séparer de l'ET, mais je suis d'accord c'est la façon d'aller ici. –

+0

@Michael Madsen: Vous pouvez, mais 'IN' est plus maintenable - manquer ou égarer un crochet, et la requête peut être valide mais ne retournera pas les données correctes. Manquer un crochet sur le 'IN', et vous êtes garanti une erreur de syntaxe. –

0

« SELECT content DE bx_wall_events OU ((type = 'wall_common_text') || (type = 'wall_common_fb') || (type = 'wall_common_tw')) ET owner_id = '{$ iId}' COMMANDEZ PAR date DESC LIMIT 1 "

+2

tuyaux double dans SQL est la concaténation de chaîne. .. –

+0

Dans MySQL par défaut, || est un opérateur OR logique. Avec PIPES_AS_CONCAT activé, || est concaténation de chaîne (voir http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html) –

+0

@martin clayton: Je ne le savais pas, mais je savais que si vous activez SQL strict puis les doubles tuyaux sont pour la concaténation de cordes ... –

0

trouvé une excellente solution en utilisant IN

"SELECT `content` 
FROM `bx_wall_events` 
WHERE `owner_id`='{$iId}' 
AND `type` 
IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw') 
ORDER BY `date` 
DESC LIMIT 1"