MySQL-在子查询的别名上使用REGEXP

MySQL-在子查询的别名上使用REGEXP,mysql,regex,Mysql,Regex,如何在子查询的别名上使用REGEXP SELECT colA, colB, (SELECT colA FROM t2 WHERE t1.colID=t2.colID) as colC FROM t1 WHERE colC REGEXP '$string' ORDER BY IF($col = '' OR $col IS NULL,1,0),$col"; 如果我对完整的查询进行另一次选择,它会起作用,但我发现这需要一些时间 SELECT * FROM ( SE

如何在子查询的别名上使用REGEXP

SELECT 
    colA,
    colB,
    (SELECT colA FROM t2 WHERE t1.colID=t2.colID) as colC
FROM t1
WHERE colC REGEXP '$string'
ORDER BY IF($col = '' OR $col IS NULL,1,0),$col";



如果我对完整的查询进行另一次选择,它会起作用,但我发现这需要一些时间

SELECT * FROM (
    SELECT 
        colA,
        colB,
        (SELECT colA FROM t2 WHERE t1.colID=t2.colID) as colC
    FROM t1
) as temp
WHERE colC REGEXP '$string'
ORDER BY IF($col = '' OR $col IS NULL,1,0),$col";



如果使用联接并直接引用表字段,则REGEXP可以工作,但顺序也不能与别名一起工作

SELECT 
    t1.colA AS colA,
    t1.colB AS colB,
    t2.colA AS colC
FROM t1
LEFT JOIN t2 ON t1.colID=t2.colID
WHERE t2.colA REGEXP '$string'
ORDER BY IF($col = '' OR $col IS NULL,1,0),$col";




那么,完整查询上的select是完成我需要的唯一方法吗?

您可以使用HAVING子句(这不是标准的SQL-MySQL功能):


这会影响性能-您的加入是一个更好的查询。

通常,给定范围的
WHERE
子句无法看到其
SELECT
列表中定义的别名(请参阅)。如果使用
table.column
而不是别名,那么join可能比subselect的性能要好得多。您能解释一下上一个示例不起作用的原因吗?(FWIW:我认为由于WHERE子句,不需要左连接。您可以将左连接和WHERE作为
连接t2写入t1.colID=t2.colID和t2.colA REGEXP'$string'
)似乎在IF子句中不能使用别名。我使用左联接是因为并非所有行都有联接项,我希望表1中的所有行都有联接项。
SELECT 
    colA,
    colB,
    (SELECT colA FROM t2 WHERE t1.colID=t2.colID) as colC
FROM t1
HAVING colC REGEXP '$string'
ORDER BY IF($col = '' OR $col IS NULL,1,0),$col";