4

ユニオンクエリがあります。基本的な(同様の)例を次に示します。

SELECT a.Name, b.Info
FROM a 
LEFT JOIN b ON (a.ID = b.ID) 
WHERE a.Name LIKE "a%"
UNION
SELECT a.Name, b.Info 
FROM a
LEFT JOIN b ON (a.ID = b.ID)
WHERE a.Name LIKE "b%"
ORDER BY a.Name, b.Info;

「'order句'の不明な列'b.Info'」というエラーが表示されます。

ORDER BY句の末尾から「b.Info」を削除すると、機能します。

アイデア?

4

4 に答える 4

3

この問題は、MySQLのドキュメント(12.2.8.3 UNION構文)で説明されています。元のテーブル名は使用できないため、各列にエイリアスを指定し、これをORDERBY句で使用します。

ORDER BYまたはLIMIT句を使用してUNION結果全体をソートまたは制限するには、個々のSELECTステートメントを括弧で囲み、最後のステートメントの後にORDERBYまたはLIMITを配置します。次の例では、両方の句を使用しています。

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

この種のORDERBYは、テーブル名(つまり、tbl_name.col_name形式の名前)を含む列参照を使用できません。代わりに、最初のSELECTステートメントで列エイリアスを指定し、 ORDERBYでエイリアスを参照してください。

于 2009-09-03T14:04:23.437 に答える
3

Orderbyは、連合が行われた後、結合された結果セットに適用されます。この時点では、いわばテーブルは1つしかないため、b.Infoへの参照は無効になります。

SELECT a.Name AS 'NameCol', b.Info AS 'InfoCol' FROM a LEFT JOIN b ON (a.ID = b.ID) WHERE 
a.Name LIKE "a%" UNION SELECT a.Name AS 'Name', b.Info AS 'Info' FROM a LEFT JOIN b ON
(a.ID = b.ID) WHERE a.Name LIKE "b%" ORDER BY NameCol, InfoCol;

MySQLにソート操作に一時テーブルを使用させるため、これは潜在的に非常に遅くなる可能性があることに注意してください(結果セットが大きい場合)。

于 2009-09-03T13:57:14.200 に答える
1

なぜユニオンを使っているのですか?このクエリは同じで高速です。

SELECT a.Name, b.Info FROM a LEFT JOIN b ON a.ID = b.ID
WHERE (a.Name LIKE "a%" OR a.Name LIKE "b%") ORDER BY a.Name, b.Info;

かっこを読んでください

于 2011-05-13T05:28:08.603 に答える
0

クエリを実行するときは、句UNIONの名前ではなく、列の位置を指定する必要があると思います。ORDER BY試してみてくださいORDER BY 1,2

于 2009-09-03T13:56:23.653 に答える