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