MySql中的WHERE AND语句

时间:2012-11-26 21:52:45

标签: mysql

我正在使用以下MySQL语句获取Drupal帖子,其中ID匹配表:

SELECT node.nid,node_revisions.nid,url_alias.nid, 1, FROM_UNIXTIME(node.created), node_revisions.body, node_revisions.title, node_revisions.teaser, url_alias.slug, FROM_UNIXTIME(node.changed), if(node.type='blog', 'post', 'page')
FROM node, node_revisions, url_alias 
WHERE (node.type='blog' OR node.type='page') 
AND (node.nid=node_revisions.nid) 
AND (node.nid=url_alias.nid)
LIMIT 10;

(请注意,我已对url_alias进行了一些修改,如果有人试图复制此内容)

我必须使用两个AND语句,因为出于某种原因,这不起作用:

...
WHERE ...
AND (node.nid=node_revisions.nid=url_alias.nid)
...

为什么我不能在一个AND语句中比较所有ID?

4 个答案:

答案 0 :(得分:4)

SQL不能那样工作。 MySQL只接受单对二进制比较。大多数编程语言都会表现得像你想要的那样,但SQL不是一种编程语言。明确地编写联接将有助于查询的可读性,并且可能是您正在尝试执行的操作。查询可以像这样重写:

SELECT nid, 1, FROM_UNIXTIME(node.created), node_revisions.body, node_revisions.title,
    node_revisions.teaser, url_alias.slug, FROM_UNIXTIME(node.changed),
    if(node.type='blog', 'post', 'page')
FROM node
    JOIN node_revisions USING (nid)
    LEFT JOIN url_alias USING (nid)
WHERE node.type IN ('blog','page')
LIMIT 10

我还将select中的三个nid列更改为一个,因为它总是相同的,使post类型条件成为IN子句,因为它更好地优化,并使{{1如果节点没有别名,则JOIN一个url_aliases

答案 1 :(得分:2)

SQL中的=比较器是二进制的。在任何情况下都不允许a = b = c。

答案 2 :(得分:1)

我想说你提供的语法可以用两种方式解释。

您正在驾驶的直观的人性化方式,您可以在其中编写等效的

(node.nid=node_revisions.nid) AND (node_revisions.nid=url_alias.nid)

计算机解释它的方式只是简单地解决从左到右的操作:

(node.nid=node_revisions.nid)=url_alias.nid

即,分析url_alias.nid是否等于前一个相等的真/假(或实际上是0/1,在这种情况下)。这不是微不足道的,布尔运算的结果通常被视为变量并直接以这种方式进行比较。

答案 3 :(得分:1)

在编程语言中(尽管SQL不是一个),比​​较会返回一个布尔值,并且根据符号的顺序然后从左到右进行不加表达的多次计算。所以如果它是PHP

$a == $b == 3会编译成
($a == $b) == 3将编译成
相应地true == 3false == 3