2012-12-18 52 views
0

对不起,不知道如何制定这个问题。我会尽力解释。这里有一个查询:Mysql别名数据没有选择它

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

它让我在聚集多列数据执行操作,并且,当它工作正常,我不想要的“水木清华”一栏的结果居然被选中并返回。是否有可能Ø做这样的事?:

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

抑或是MySQL的优化已经有多个相同concats查询不concatinate相同的数据两次?

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

回答

1

直接使用所需的表达相关WHEREHAVING子句中:

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 
+0

它实际上是同一个问题的一部分:这种方法是否会被数据库引擎优化?或者是否必须将相同的数据CONCAT N次,降低性能? – Marius

+0

@Marius:道歉,我错过了。在这种情况下,如上所述,MySQL是优化相同的连接,以便它只执行一次操作。 – eggyal

+0

谢谢你,这就是我想确认:) – Marius

0

如果你不想选择它应该工作:

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

首先,MySQL在任何新版本上执行此优化。

其次,你需要写

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

没有别名 - 别名是字段列表定义,而不是在WHERE条款(但ofcourse你可以使用他们在where子句中)

+0

是的,我知道别名在列表中定义:)这只是一个例子让人们明白我想问:)如果优化被执行 - 那么问题解决了。谢谢。 – Marius