使用select语句从数据库获取最大匹配项

时间:2015-09-17 19:46:02

标签: mysql sql

我尝试使用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' )

3 个答案:

答案 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中使用它。