0

我正在使用以下 MySQL 语句来获取 ID 跨表匹配的 Drupal 帖子:

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

4 回答 4

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子句,因为这样可以更好地优化,并JOIN使用url_aliasesaLEFT JOIN以防节点没有别名。

于 2012-11-26T21:59:49.137 回答
2

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

于 2012-11-26T21:58:30.067 回答
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)结果。这不是微不足道的,布尔运算的结果通常被视为变量并以这种方式直接比较。

于 2012-11-26T22:03:48.810 回答
1

在编程语言中(尽管 SQL 不是一种),比较返回一个布尔值,并且不带括号的多重计算是按照符号的顺序进行的,然后从左到右。所以如果是 PHP

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

于 2012-11-26T22:06:19.887 回答