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 にいくつかの変更を加えたことに注意してください)

何らかの理由でこれが機能しないため、2 つの AND ステートメントを使用する必要があります。

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

1 つの AND ステートメントですべての ID を比較できないのはなぜですか?

4

4 に答える 4

4

SQLはそのようには機能しません。MySQL はバイナリ比較の 1 つのペアのみを受け入れます。ほとんどのプログラミング言語は思いどおりに動作しますが、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 の 3 つの列を 1 つに変更しnidます。これは、常に同じになるINためです。最適化が向上するため、投稿タイプの条件を句にし、ノードにエイリアスがない場合に備えてJOINwith url_aliasesaを作成しました。LEFT 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 が前の等値の true/false (この場合は実際には 0/1) の結果と等しいかどうかを分析します。これは些細なことではありません。ブール演算の結果は変数として扱われ、この方法で直接比較されることがよくあります。

于 2012-11-26T22:03:48.810 に答える
1

プログラミング言語 (SQL は 1 つではありませんが) では、比較はブール値を返し、括弧なしの複数の計算が符号の順序に従って行われ、次に左から右に行われます。PHPだったら

$a == $b == 3
($a == $b) == 3which はにコンパイルされます
true == 3またはfalse == 3それに応じてコンパイルされます

于 2012-11-26T22:06:19.887 に答える