gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:31:23 24 4
gpt4 key购买 nike

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

示例我在公司 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 |
+--+-----+-------+---------+-------+

如果有公司或集团的设置,则使用它,否则使用默认行(公司和集团均为 NULL)。还有更多的列,如公司和集团。

我需要从该表中选择 id:s 1,4 和 6,因为在这种情况下它们是我需要的设置。 id 1 和 id 4 与我的用户信息匹配,id 5 也匹配,但 id 4 是完全匹配。 id 6 匹配,因为没有更接近类型 3 的设置。

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

我尝试选择行并使用公司 DESC 对其进行排序,但是在分组类型时它不起作用。我还尝试加入公司不为空的 max(company),但我被卡住了,现在正试图获得帮助。

如果有人能帮助我解决这个问题,我将不胜感激!

最佳答案

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
)

查看 sqlfiddle .


JOIN 中重写,这应该会提供更好的性能:

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
)

查看 sqlfiddle .

关于mysql - 从具有给定条件的表中选择不同类型的多行,如果未找到,则选择下一个可能的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com