0

申し訳ありませんが、この質問の作成方法がわかりません。説明しようと思います。クエリは次のとおりです。

SELECT CONCAT(uno, due, tre) AS smth ... HAVING smth LIKE ...

これにより、集約された複数列のデータに対して操作を実行できますが、正常に機能しますが、「smth」列の結果が実際に選択されて返されることは望ましくありません。このようなことをすることは可能ですか?:

SELECT ... WHERE CONCAT(uno, due, tre) AS smth LIKE '...' OR smth LIKE '...' ...

または、mysqlは、同じデータを2回連結しないように、複数の同一の連結を使用してクエリをすでに最適化していますか?

質問が明確であることを願っています。考えていただきありがとうございます。

4

3 に答える 3

1

WHERE関連する句またはHAVING句で目的の式を直接使用します。

SELECT
  -- etc.
HAVING CONCAT(uno, due, tre) LIKE '...'
    OR CONCAT(uno, due, tre) LIKE '...'
  -- etc.

MySQLは、クエリごとに1回だけ同じ引数が与えられた決定論的関数を評価するため、クエリの冗長性にもかかわらず、効率は低下しません(解析量はごくわずかです)。

または、クエリに対して外部選択を実行して、対象の列のみを返すこともできます。

SELECT ... FROM (
  SELECT CONCAT(uno, due, tre) AS smth ... HAVING smth LIKE ...
) t
于 2012-12-18T12:05:01.217 に答える
1

まず、MySQLは新しいバージョンでこの最適化を実行します。

次に、書く必要があります

WHERE CONCAT(uno, due, tre)  LIKE '...' 

エイリアスなし-エイリアスは、句ではなくフィールドリストで定義さWHEREれます(ただし、もちろん、where句で使用できます)。

于 2012-12-18T12:06:34.757 に答える
0

選択したくない場合は、次のように機能します。

SELECT ... WHERE CONCAT(uno, due, tre)  LIKE '...' OR smth LIKE '...' ...
于 2012-12-18T12:05:11.017 に答える