mysql - 在 MySQL 中存储配置的最佳方式

标签 mysql sql relational-database

我有一个场景,我需要在 mysql 表中存储配置,该表具有三列,即 VendorIDServiceIDModeID 。供应商的配置可以通过以下三种最重要的情况来完成。

  1. 一列 VendorID 具有非 NULL 值,ServiceID 、ModeID 具有 NULL 值。

供应商ID、服务ID、模式ID --> 1,NULL,NULL

  • 两列 VendorID、ServiceID 具有非 NULL 值,ModeID 具有 NULL 值。
  • 供应商ID、服务ID、模式ID --> 1,1,NULL

  • 所有三列都具有非 NULL 值。
  • 供应商ID、服务ID、模式ID --> 1,1,1

    当定义了 case 1,2,3 并在 MySQL 查询 WHERE 子句中传递了vendorid、servideid 和 modeid 时,case 3 会覆盖 case 2 和 case 1。

    当未定义情况 3 且定义了情况 1,2 且在 MySQL 查询 WHERE 子句中传递了vendorid、servideid 和 modeid 时,情况 2 会覆盖情况 1。

    当未定义 case 3 和 case 2 且定义了 case 1 且在 MySQL 查询 WHERE 子句中传递了vendorid、servideid 和 modeid 时,则返回 case 1。

    现在我的问题是,当vendorid、servideid和modeid在查询中一次性传入时,如何查询表以获取返回的配置,而不必分别查询3次。

    也欢迎任何其他解决上述问题的好方法。

    最佳答案

    你可能想要这个:

    where (VendorID, ServiceID, ModelID) = ($VendorID, $ServiceID, $ModelID) or
          ( (VendorID, ServiceID) = ($VendorID, $ServiceID) and ModelId is null) or
          ( VendorID = $VendorID and ServiceID is null and ModelId is null)
    

    或者您可能想要:

    select t.*
    from t
    where VendorId = $VendorId and
          (ServiceId = $ServiceId or ServiceId is null) and
          (ModelId = $ModelId or ModelId is null)
    order by ( ServiceId is not null ) desc,
             ( ModelId is not null ) desc
    limit 1;
    

    这将返回具有最佳匹配的一行。

    关于mysql - 在 MySQL 中存储配置的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54942582/

    相关文章:

    PHP mysqli 查询错误但查询正确

    php - MySQL Select Hex() 输出不起作用

    mysql - 哪个sql语句应该是正确的?

    mysql - 在mysql中获取特定时间后的下一个可用时间段

    mysql - 导入数据时mysql中的quotechar是什么意思?

    mysql - 具有关系的计数表 vb.net

    php - 使用 PHP 和 AJAX 将数据从表单加载到 MySQL

    Mysql 字符串和数字不相等/不匹配

    mysql - SQL表中的用户ID号自动递增

    MySQL 外键导致表删除