mysql - 给定一组值,什么 SQL 查询会在我的数据库中找到这些值最多的行?

标签 mysql sql database

我有一个简单的数据库,它使用表单条目来确定要显示的文件。但几乎不需要任何表单字段,而且我的许多数据库条目都是类似主题的变体。

我如何设计一个 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/

相关文章:

MYSQL error 1062.如何使整行数据唯一。并包含一个 AUTO_INCREMENT?

php - 带有查询参数的 Laravel REST API

javascript - 保存或选择时出现 HTML5 数据库问题

ios - 如何允许用户将照片添加到其他人可以使用 Firebase 查看的应用程序

mysql 左连接问题

mysql - 无法连接到本地服务器 : using rails server, 出现错误

sql - 列名中应该使用下划线吗?

javascript - Javascript 中的 Flask 变量不显示

sql - postgres 使用过度分区对动态行求和

MySQL如何对一名学生的科目成绩进行排名/位置