在MySQL中存储配置的最佳方法

时间:2019-03-01 10:22:33

标签: mysql sql relational-database

我有一种情况,我需要将配置存储在具有三列的mysql表中,即 VendorID ServiceID ModeID 。可以通过以下三种主要情况来完成供应商的配置。

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

VendorID,ServiceID,ModeID-> 1,NULL,NULL

  1. 两列VendorID,ServiceID具有非NULL值,而ModeID具有NULL值。

VendorID,ServiceID,ModeID-> 1,1,NULL

  1. 所有三列均具有非NULL值。

VendorID,ServiceID,ModeID-> 1,1,1

定义了案例1,2,3并在MySQL查询WHERE子句中传递了vendorid,servideid和modeid之后,案例3会覆盖案例2和案例1。

当未定义案例3并定义案例1,2,并且在MySQL查询WHERE子句中传递了vendorid,servideid和modeid时,案例2将覆盖案例1。

如果未定义案例3和案例2且定义了案例1,并且在MySQL查询WHERE子句vendorid,servideid和modeid中传递,则返回案例1。

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

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

1 个答案:

答案 0 :(得分:0)

您可能想要这个:

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;

这将返回最匹配的一行。