我很难从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但没有得到正确的结果!
答案 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);
}