2

タイプ、値、会社、グループなどの列がある設定テーブルのようなものがあります。そのテーブルから、ユーザー情報が他の列と一致するかどうかに応じて、すべての異なるタイプの1つの行のみを選択する必要があります。

例私は会社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を選択する必要があります。ID1とID4は私のユーザー情報と一致し、ID 5も一致しますが、ID4は完全に一致します。タイプ3のより近い設定がないため、ID6が一致します。

何百もの会社やグループが存在する可能性があるため、正しい設定値を取得するためにPHPアルゴリズムを作成したくありません。それは悲惨なことになるでしょう。

行を選択してDESC社に注文しようとしましたが、タイプをグループ化すると機能しません。また、companyがNULLではない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でそれを参照してください。


で書き換えると、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 に答える