我正在使用以下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?
答案 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 == 3
或false == 3