2

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

示例我在公司 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) ,其中公司不为空,但我被卡住了,现在试图寻求帮助。

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

4

1 回答 1

2
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上查看。


在 a 中重写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上查看。

于 2012-10-04T11:49:21.333 回答