Mysql 从一个具有给定条件的表中选择多个不同类型的行,如果未找到,请选择下一个可能的行

Mysql 从一个具有给定条件的表中选择多个不同类型的行,如果未找到,请选择下一个可能的行,mysql,select,join,settings,Mysql,Select,Join,Settings,我有一种设置表,其中有类型、值、公司、组等列。根据我的用户信息是否与其他列匹配,我只需要从该表中选择每种不同类型的一行 示例我在公司1和组1中,我的设置表由以下行组成: +--+-----+-------+---------+-------+ |id|type | value | company | group | +--+-----+-------+---------+-------+ |1 |1 | 50 | 1 | 1 | |2 |1 | 70

我有一种设置表,其中有类型、值、公司、组等列。根据我的用户信息是否与其他列匹配,我只需要从该表中选择每种不同类型的一行

示例我在公司1和组1中,我的设置表由以下行组成:

+--+-----+-------+---------+-------+
|id|type | value | company | group |
+--+-----+-------+---------+-------+
|1 |1    | 50    | 1       | 1     |
|2 |1    | 70    | NULL    | NULL  |
|3 |2    | 1     | NULL    | NULL  |
|4 |2    | 99    | 1       | 1     |
|5 |2    | 999   | NULL    | 1     |
|6 |3    | 500   | NULL    | NULL  |
+--+-----+-------+---------+-------+
如果有公司或集团的设置,则使用该设置,否则使用默认行(公司和集团为空)。还有两个以上的专栏,如company和group

从该表中,我需要选择id:s1、4和6,因为它们是我在本例中需要的设置。Id 1和Id 4与我的用户信息匹配,Id 5也匹配,但Id 4完全匹配。Id 6匹配,因为没有任何类型3的更接近设置

可能有数百家公司和团体,所以我不想创建一个PHP算法来获得正确的设置值。那将是灾难性的

我试图选择行并用company DESC对它们进行排序,但在分组类型时它不起作用。我还试图加入公司不为空的max(公司),但我陷入困境,现在试图寻求帮助

如果有人能帮我处理这个案子,我将不胜感激

SELECT * FROM my_table WHERE id IN (
  SELECT (
    SELECT   b.id
    FROM     my_table b
    WHERE    b.type = a.type
         AND IFNULL(b.company = 1, TRUE)
         AND IFNULL(b.group   = 1, TRUE)
    ORDER BY b.company DESC, b.group DESC
    LIMIT    1
  ) FROM (
    SELECT DISTINCT type FROM my_table
  ) a
)
在电视上看


在一个
连接中重写
,这将提供更好的性能:

SELECT my_table.*
FROM   my_table
JOIN (
  SELECT DISTINCT type FROM my_table
) a ON my_table.id = (
  SELECT   b.id
  FROM     my_table b
  WHERE    b.type = a.type
       AND IFNULL(b.company = 1, TRUE)
       AND IFNULL(b.group   = 1, TRUE)
  ORDER BY b.company DESC, b.group DESC
  LIMIT    1
)

请参见。

在上面的示例中,如果
id=4
具有
(公司、集团)=(1,空)
,您希望
type=2
使用哪条记录?
id=3
id=4
在一个字段上匹配,但在另一个字段上不匹配。一个有优先级吗?id 4是完全匹配的,所以它有优先级,并且应该在结果中。另外,id 4比id 5具有更大的优先级,因为id 5是部分匹配。是的,但是在
id=4
had
(company,group)=(1,NULL)
?id=4是(company,group)=(1,1)。我的问题是,如果这样做会怎么样。它似乎有效。明天我将在大数据库中测试它。谢谢这就是我所期望的!第一次查询耗时太长(44秒),无法从5000行中获取40种不同的设置类型(可能不是实际的数量),但使用JOIN时,耗时0.016秒。我知道这将是可能的加入,但我不知道如何做到这一点。再次感谢@Limitteri:根据您的索引,您可以通过将
IFNULL(b.company=1,TRUE)
替换为
(b.company=1或b.company为NULL)
来获得更好的性能,对于
b.group