在MySQL中选择具有最大匹配记录的行

时间:2016-05-15 14:08:56

标签: mysql

我很难从MySQL查询中获得所需的结果。我有一张名为' lyricist'这些列是'关键字'并且' name'。

SELECT name FROM `lyricist` WHERE keywords LIKE '%আমরা%' or keywords LIKE '%সোনার%' or keywords LIKE '%সয়না%' 

但它有两行因为আমরা和সোনার这两个词来自row1而সয়না来自row2。但我希望得到一行与相似单词中的最大单词匹配。如果两行具有相同数量的匹配单词,则可能返回第一行。

SELECT name, count(*) FROM `lyricist` WHERE keywords LIKE '%আমরা%' or keywords LIKE '%আয়%' 

这会返回一行,但计数结果并非完全正确!我怎样才能做到这一点?我尝试使用max,regex,match但没有得到正确的结果!

2 个答案:

答案 0 :(得分:2)

同意@vp_arth,关键字属于他们自己的表格。

[Required]

然后你可以这样做

+----------+-------------+
| keyword  | lyricist_id |
+----------+-------------+

如果不可能,你可以这样做。

SELECT count(*) AS c FROM keyword where FIND_IN_SET(keyword, 'আমরা,সোনার') GROUP BY lyricist_id ORDER BY c DESC LIMIT 1;

这使用一系列SELECT `name`, IF(FIND_IN_SET('আমরা', `keywords`), 1, 0) + IF(FIND_IN_SET('সোনার', `keywords`), 1, 0) as `matches` FROM `lyricist` ORDER BY `matches` DESC LIMIT 1; 语句,返回1或0,具体取决于是否找到匹配项。结果总结为IF。 这确实有效,但维护起来会更困难,效率也会降低。

请注意使用mysql的matches函数(而不仅仅是使用FIND_IN_SET)这样可以防止因关键字列表的部分匹配而产生的问题 - 例如{{1} },搜索' happy'会很满意'快乐'和不快乐的#39;在关键字列表中。

答案 1 :(得分:1)

与其他人一样,通常最佳做法是规范化您的数据并将关键字保存在不同的表中。但是如果出于某种原因您想要将它们保留为逗号分隔的字符串,则解决方案将像您现在一样获取所有匹配的记录然后使用php找到你想要的那个。这样的东西可以工作:

$val="keyword1,keyword2,keyword3";
$keywords=explode(',',$val);

// CODE TO CONSTRUCT YOUR QUERY HERE
//

$result=mysqli($query);
if(mysqli_num_rows>0){
     $max_matches=0;
     while ($lyricist = $result->fetch_object()) {
        $lyricist_keywords=explode($lyricist->keywords);    
        $matches=count(array_intersect($keywords, $lyricist_keywords));
        if($matches>$max_matches) $best_match=$lyricist;
    }

    var_dump($best_match);
}