我有一张状态表。
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)中,因为它将成为另一个查询的连接,以便为另一个报告提取用户特定的描述。
答案 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。通过用字段名替换*来从联合中删除这些,联合会自动删除重复项,或至少看起来......