如果找不到用户特定的值,则mysql从表中选择默认值

时间:2017-01-04 15:22:04

标签: mysql select default

我有一张状态表。

ID         UserID   StatusID   Description
1          0        0          ready
2          0        1          on hold
3          0        2          cancelled
4          3        1          waiting
5          3        2          deleted
6          3        4          waiting on supplier
7          4        5          postponed

等...

UserID 0保存我的默认说明。如果没有具有相同状态ID的用户值,我想为用户 提取默认值的所有状态文本。 例如,用户ID 3应该返回

ID         UserID   StatusID   Description
    1          0        0          ready
    4          3        1          waiting
    5          3        2          deleted
    6          3        4          waiting on supplier

例如用户ID 4应该返回

ID         UserID   StatusID   Description
1          0        0          ready
2          0        1          on hold
3          0        2          cancelled
7          4        5          postponed

用户ID 7应该返回

ID         UserID   StatusID   Description
1          0        0          ready
2          0        1          on hold
3          0        2          cancelled
到目前为止,我有这个:

select description.* from status_description description 
join (
    select max(id) as maxid from (
    select * from status_description default where default.user_id = 0
    union
    select * from status_description userstatus where ectfsa.user_id = 67
    ) as subset
    group by subset.ID
) as newest_desc on newest_desc.maxid = description.id
order by StatusID asc;

我将用户状态和默认状态结合在一起,然后将每个statusID的最大ID加回原始表,以获取用户和默认值。

这可以正常工作,直到有人添加具有更高ID的新USERID0状态。例如,我们决定现在所有用户都应该选择"推迟"我们添加一行

ID         UserID   StatusID   Description
8          0        5          next week

应该是相同的" status" as"推迟"但对于所有用户而言,用户ID 4具有不同的措辞。

如果有更优雅的方式不使用Max而只选择默认值并添加用户状态覆盖已存在的默认值?

我需要将它保留在mysql(即不是php)中,因为它将成为另一个查询的连接,以便为另一个报告提取用户特定的描述。

1 个答案:

答案 0 :(得分:0)

我认为这可能是一个解决方案:

select * from (
    select StatusID,Description from status_description default where default.user_id = 0
    union
    select StatusID,Description from status_description userstatus where ectfsa.user_id = 67
    ) as StatusID;

我不需要结果或ID中的UserID。通过用字段名替换*来从联合中删除这些,联合会自动删除重复项,或至少看起来......