【发布时间】:2016-02-12 13:03:50
【问题描述】:
我有下表
+-------+-------+-------+
| ID | Name1 | Name2 |
+-------+-------+-------+
| 1| Steve | Steven| - true
| 1| Steven| Steve | - true
| 1| Max | Steve | - false
| 1| Steve | Steve | - true
+-------+-------+-------+
我需要确定行,其中Name1 以Name2 开头或Name2 以Name1 开头
问题:
有没有比Name2 LIKE Concat(Name1, '%') OR Name1 LIKE Concat(Name2, '%')更好的方法
这个例子有点简化,因为Name1 是一个巨大的子选择,像Concat(Name1, '%') LIKE Concat(Name2, '%') 这样的东西会大大提高我的应用程序的性能
更新:
指出我的问题,完整的选择看起来像
(SELECT Name FROM User JOIN UserGroup ON User.UserID = UserGroup.UserID JOIN Company ON Company.UserID = User.UserID WHERE UserGroup.Range > 2 AND User.Create > '2010-01-01' AND Company.Country = 'CH' ORDER BY User.StartDate DESC LIMIT 1) AS Name2
所以上面的语句看起来像
(SELECT Name FROM User JOIN UserGroup ON User.UserID = UserGroup.UserID JOIN Company ON Company.UserID = User.UserID WHERE UserGroup.Range > 2 AND User.Create > '2010-01-01' AND Company.Country = 'CH' ORDER BY User.StartDate DESC LIMIT 1) LIKE Concat(Name1, '%') OR Name1 LIKE Concat((SELECT Name FROM User JOIN UserGroup ON User.UserID = UserGroup.UserID JOIN Company ON Company.UserID = User.UserID WHERE UserGroup.Range > 2 AND User.Create > '2010-01-01' AND Company.Country = 'CH' ORDER BY User.StartDate DESC LIMIT 1), '%')
并且 select 被调用了两次 - 必须有一种方法可以从数据库中仅获取一次 Name2
【问题讨论】:
-
你的方法很好。但是,您可能应该在
from子句中进行复杂的计算。 -
您可以尝试使用
LOCATE代替,检查一个是否是另一个的子字符串,如果是,则出现的位置是 1 - 这至少可以消除 concact-with -百分号部分。LOCATE(Name1, Name2) = 1 OR LOCATE(Name2, Name1) = 1 -
在您更新的 SQL 中,Name1 来自哪里?
-
Name2 只是嵌套 select 语句的占位符,Name1 是上层 select 语句的字段
-
抱歉,还没关注。编辑后的 SQL 说:(big-select) LIKE Concat(Name1,'%') OR Name1 LIKE Concat(big-select, %)。 Name1 是另一个选择语句吗?这都是 WHERE 子句的一部分吗?
标签: mysql sql wildcard sql-like