2

このクエリを 2 つの方法で実装しました。

SELECT race1, mode1
FROM organization 
WHERE condition = 1 LIMIT 1

UNION ALL

(SELECT race2, mode2
FROM   organization 
WHERE  condition = 1 LIMIT 1)

UNION ALL

(SELECT race, mode FROM  organization_new
WHERE PK_Id = 1)

SELECT race1, mode1
FROM organization 
WHERE condition = 1 LIMIT 1

UNION ALL

SELECT race2, mode2
FROM   organization 
WHERE  condition = 1 LIMIT 1

UNION ALL

SELECT race, mode FROM  organization_new
WHERE PK_Id = 1

ご覧のとおり、違いは最初のクエリの括弧のみです。最初のクエリでは、期待どおりの結果が得られます (3 つの選択すべてからすべての値を取得します。説明は不要です)。しかし、2番目のクエリを進めると、期待どおりの結果が得られますが、期待どおりではありません。これは、WHERE句を満たす最初の選択からの値のみです。つまり、race1, mode1whereがある場合condition = 1、その結果のみが得られます。そうでない場合、私はrace2, mode2どこに行きますかcondition = 1。2 番目の select ステートメントでも空の場合は、3 番目の select ステートメントに従って値を取得します。かっこが指定されていない場合、なぜUNION ALL動作するのですか?OR

編集: MySQL 5.0.51aを使用しています

4

1 に答える 1

2

これは、LIMIT を使用しているためです。

MySql リファレンスによると、個々の選択で ORDER BY または LIMIT を使用する場合は、選択を括弧で囲む必要があります。

例 (MySQL リファレンスから):

個々の SELECT に ORDER BY または LIMIT を適用するには、SELECT を囲む括弧内に句を配置します。

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

リソースはここにあります: http://dev.mysql.com/doc/refman/5.0/en/union.html

編集:以前のものはバージョン 5.5 用だったため、参照リンクを変更しました。しかし、答えは変わりませんでした。

于 2012-04-18T08:38:04.727 に答える