我尝试使用SELECT语句从我的数据库中获得匹配数大于0的匹配数,但我也想获得最大匹配数。因此,如果有1,2和3的匹配,我只想要匹配3.在我添加了部分" AND'匹配' = MAX('匹配')",由于某种原因,它停止获得结果。在我添加之前它已经得到了结果。我想知道我做错了什么,以及如何解决它。感谢。
SELECT input, response,
( input LIKE '% you %' ) +
( input LIKE '% are %' ) +
( input LIKE '% here %' )
AS 'matches'
FROM allData
HAVING `matches` > 0
AND 'matches' = MAX( 'matches' )
答案 0 :(得分:2)
您在问题中标记了mysql。这有点不幸,因为对于几乎任何其他当今流行的关系数据库而言,问题可以更清晰地回答,而不是MySQL。不过,使用MySQL你可以这样做:
SELECT
input,
response,
( input LIKE '% you %' ) +
( input LIKE '% are %' ) +
( input LIKE '% here %' )
AS matches
FROM allData
HAVING matches > 0
AND matches = (
SELECT MAX(
( input LIKE '% you %' ) +
( input LIKE '% are %' ) +
( input LIKE '% here %' ) )
FROM allData
)
答案 1 :(得分:1)
只需将<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<span class="logo">LOGO</span>
</div>
<div class="action">
<span>Action</span>
</div>
与ORDER BY
一起使用即可获得最佳记录:
LIMIT
如果出现平局,你只会获得一个随机最佳记录。如果你想要所有,那么请选择John Bollinger的答案。
SQL小提琴:http://sqlfiddle.com/#!9/1ece1/3。
如果您想计算多个匹配项,请使用一些数学运算:从输入中删除搜索字符串并计算其长度被删除的频率:
SELECT input, response,
( input LIKE '% you %' ) +
( input LIKE '% are %' ) +
( input LIKE '% here %' )
AS matches
FROM allData
HAVING matches > 0
ORDER BY matches DESC LIMIT 1;
SQL小提琴:http://sqlfiddle.com/#!9/f680b/3。
还有一个小提示,展示它是如何运作的:http://sqlfiddle.com/#!9/f680b/1。
以下是John使用相同技术的查询:
SELECT input, response,
((length(input) - length(replace(input, ' you ', ''))) / length(' you ')) +
((length(input) - length(replace(input, ' are ', ''))) / length(' are ')) +
((length(input) - length(replace(input, ' here ', ''))) / length(' here '))
AS matches
FROM allData
HAVING matches > 0
ORDER BY matches DESC LIMIT 1;
SQL小提琴:http://sqlfiddle.com/#!9/57098/1。
关于'你,你'你是对的;通过从字符串中删除“你”,我需要一个空间来找到下一个“你”。您可以轻松绕过这一点,方法是在执行操作之前用SELECT input, response,
((length(input) - length(replace(input, ' you ', ''))) / length(' you ')) +
((length(input) - length(replace(input, ' are ', ''))) / length(' are ')) +
((length(input) - length(replace(input, ' here ', ''))) / length(' here '))
AS matches
FROM allData
HAVING matches > 0
AND matches =
(
SELECT MAX(
((length(input) - length(replace(input, ' you ', ''))) / length(' you ')) +
((length(input) - length(replace(input, ' are ', ''))) / length(' are ')) +
((length(input) - length(replace(input, ' here ', ''))) / length(' here '))
)
FROM allData
);
中的两个空格替换每个空格。你也可以想要增加一个领先的和一个训练空间。 (您甚至可能希望在字符串上应用input
,以便找到“您”以及“您”。)
所以替换
LOWER()
与
FROM allData
答案 2 :(得分:0)
如果您希望所有行都具有最大匹配项,那么一种方法是使用子查询:
SELECT input, response,
( input LIKE '% you %' ) + ( input LIKE '% are %' ) + ( input LIKE '% here %' ) AS matches
FROM allData
HAVING matches = (SELECT ( input LIKE '% you %' ) + ( input LIKE '% are %' ) + ( input LIKE '% here %' ) as matches
FROM allData
HAVING `matches` > 0
ORDER BY matches DESC
LIMIT 1
)
然而,还有另一种使用变量的方法:
SELECT t.*
FROM (SELECT input, response,
( input LIKE '% you %' ) + ( input LIKE '% are %' ) + ( input LIKE '% here %' ) AS matches,
(@m := if(@m < ( input LIKE '% you %' ) + ( input LIKE '% are %' ) + ( input LIKE '% here %' ),
( input LIKE '% you %' ) + ( input LIKE '% are %' ) + ( input LIKE '% here %' ), 0)
FROM allData CROSS JOIN (SELECT @m := 0) params
) t
WHERE matches = @m;
这使用在外部查询之前评估子查询的“功能”,因此您可以在子查询中设置一个值,然后在外部where
中使用它。