我有一张状态表。
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。通过用字段名称替换*从联合中删除这些联合,联合会自动删除重复项,或者至少看起来像...