我有一张状态表。

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


它的“状态”应与“已推迟”相同,但对所有用户而言,其用词都与UserID 4相同。

如果有一种更优雅的方式来执行此操作而不使用Max,而仅选择默认值并添加用户状态,则覆盖已经存在的默认状态?

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

最佳答案

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

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;


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

09-11 19:18
查看更多