我有一个简单的数据库,它使用表单条目来确定要显示的文件。但几乎不需要任何表单字段,而且我的许多数据库条目都是类似主题的变体。
我如何设计一个 SQL 查询来返回我的数据库中包含与输入的表单值最匹配的列的条目?
例如,这是我的数据库的示例:
Filename Val1 Val2 Val3 Val4 Val5
one red blue yellow
two red blue
three red blue green yellow
four red blue green violet
来 self 的表单的值:
Val1: red
Val2: blue
Val3: blue
Val4: red
Val5: yellow
是否有一个 SQL 查询将返回文件名“one”,因为它具有与表单条目中的值匹配的最多列,并且没有与输入值不同的列?如果没有,如何使用表单条目查找文件名“one”?
我敢肯定,由于缺乏经验,我只是错过了一些非常简单的东西,但显然“AND”行不通,“OR”将返回每一行。
最佳答案
我想你想要这样的东西:
select t.*
from table t
order by ((col1 in (val1, val2, val3, val4, val5)) +
(col2 in (val1, val2, val3, val4, val5)) +
(col3 in (val1, val2, val3, val4, val5)) +
(col4 in (val1, val2, val3, val4, val5)) +
(col5 in (val1, val2, val3, val4, val5))
) desc
limit 1;
这会计算匹配值的数量并返回匹配最多的行。对于 null
值,它可能有意外行为。如果是这样,这里有一个简单的修复方法:
select t.*
from table t
order by ((coalesce(col1, '') in (val1, val2, val3, val4, val5)) +
(coalesce(col2, '') in (val1, val2, val3, val4, val5)) +
(coalesce(col3, '') in (val1, val2, val3, val4, val5)) +
(coalesce(col4, '') in (val1, val2, val3, val4, val5)) +
(coalesce(col5, '') in (val1, val2, val3, val4, val5))
) desc
limit 1;
编辑:
看起来这些值是“位置”的,因此 in
可以替换为 =
:
select t.*
from table t
order by ((coalesce(col1, '') = val1) +
(coalesce(col2, '') = val2) +
(coalesce(col3, '') = val3) +
(coalesce(col4, '') = val4) +
(coalesce(col5, '') = val5)
) desc
limit 1;
关于mysql - 给定一组值,什么 SQL 查询会在我的数据库中找到这些值最多的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25959394/