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 是否已经优化了具有多个相同连接的查询以不连接相同的数据两次?

我希望这个问题很清楚。谢谢你的想法。

4

3 回答 3

1

WHERE在相关的orHAVING子句中直接使用所需的表达式:

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

MySQL 仅在每个查询给定相同参数的情况下评估确定性函数一次,因此尽管查询很冗长,但它的效率并不低(除了可以忽略不计的解析量)。

或者,您可以对查询执行外部选择以仅返回感兴趣的列:

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 回答