如何根据状态ID过滤搜索结果(张贴在db-fiddle中)

时间:2018-12-19 07:56:34

标签: mysql

编辑:我已经发布了db-fiddle:https://www.db-fiddle.com/f/u2Urz7fEhLtyHotNEoH8ZG/1

小提琴中的查询显示已发送请求的水管工的结果(状态ID:1)。

我将首先解释该应用程序的功能。我希望它将使它更易于理解。

有协会,有水管工。一个协会雇用水管工。 一旦协会添加了水管工,水管工就会进入我们的数据库。

一旦关联添加了管道工,其他关联可以在我们的数据库中搜索管道工并将其添加(他们可以拥有自己的管道工,其他关联可以搜索并添加)。

当协会尝试添加水管工时,水管工会收到一个请求。水管工可以接受或拒绝在协会工作的请求。水管工接受后,协会必须再次确认,或者也可以拒绝其发送的请求(在水管工接受后)。

然后有一个管道工被协会终止,并且有管道工从该协会退出。

如果水管工被终止,他只会收到通知。

当水管工试图退出关联时,关联可以接受或拒绝退出请求。

我在根据水管工的状态显示水管工列表时遇到问题(当协会搜索水管工以发送请求时)。

可能的状态是:

1)StatusId:4-水管工已经属于该关联(当前正在搜索)-不应在搜索中显示。

2)StatusId:1-已经向水管工发送了一个请求-该请求也不应显示在搜索结果中

3)StatusId:2-水管工已经接受并且尚未确认关联-不应显示

4)StatusId:3-水管工拒绝了工作请求-应该再次在搜索中显示。

5)StatusId:4-管道工接受后,关联已被接受-由于管道工现在可用于关联,因此不应显示。

6)StatusId:5-管道工接受后关联已取消-应该在搜索中再次显示

7)StatusId:6-关联终止了管道工-应再次显示以进行请求。

8)StatusId:7-水管工从关联中发送退出请求-该不应该显示

9)StatusId:8-管理员批准退出状态-应在搜索中再次显示该状态

10)StatusId:9-管理员不批准退出请求。 -不应显示

表: The Table 编辑:我现在用以下查询发布了一个小提琴。这将显示已发送请求的水管工的结果。(状态ID:1)。

select  0 as map_id,
    mp.maintenance_user_id,
    mp.map_id as mp888,
    m.user_id,
    m.user_name,
    m.customer_id,
    m.association_id,
    m.user_email,
    m.gender,
    m.contact_no,
    r.role_type_name,
    m.full_name,         
    m.work_area,
    m.city,
    m.contact_no,
    m.address_line1,
    m.address_line2,
    m.state,
    m.country,
    m.zip_code,
    mp.status_id,
    v.vendor_name

from svk_apt_other_users_associations_mapping mp 
left join svk_apt_maintenance_users_details m on m.maintenance_user_id = mp.maintenance_user_id and m.is_active = 1
left join svk_apt_master_user_role_type r on r.role_type_id = m.user_role_type_id and r.is_active = 1 
left join svk_apt_vendors v on v.vendor_id = m.vendor_id and v.is_active = 1
left join svk_apt_associations a on a.association_id = mp.association_id and a.customer_id = mp.customer_id 
    and a.is_active = 1

LEFT JOIN svk_apt_other_users_associations_mapping mp4 on mp4.maintenance_user_id = m.maintenance_user_id
            and m.is_active = 1


where   mp.role_type_id = 8 
    and mp.maintenance_role_id = 1

    and (case when mp.customer_id = 1 and mp.association_id = 1
              then mp.status_id in(3,5,6,8)
              AND

                    mp4.maintenance_user_id not IN(                    

                        select mp1.maintenance_user_id
                        from   svk_apt_other_users_associations_mapping mp1
                        WHERE   mp1.customer_id <> 1
                                and mp1.association_id <> 1
                                 AND mp1.maintenance_user_id not IN
                                     (
                                        SELECT mp2.maintenance_user_id
                                        FROM   svk_apt_other_users_associations_mapping mp2
                                        WHERE  mp2.customer_id = 1
                                               and mp2.association_id = 1
                                               and mp2.status_id NOT IN(3,5,6,8)

                                     )

                )  

         else
                false

         end)       


    and mp.is_active = 1
    and  mp4.status_id is null

GROUP BY m.maintenance_user_id



UNION ALL    

select  0 as map_id,
    mp.maintenance_user_id,
    mp.map_id as mp888,
    m.user_id,
    m.user_name,
    m.customer_id,
    m.association_id,
    m.user_email,
    m.gender,
    m.contact_no,
    r.role_type_name,
    m.full_name, 
    m.work_area,
    m.city,
    m.contact_no,
    m.address_line1,
    m.address_line2,
    m.state,
    m.country,
    m.zip_code,
    mp.status_id,
    v.vendor_name

from svk_apt_other_users_associations_mapping mp 
left join svk_apt_maintenance_users_details m on m.maintenance_user_id = mp.maintenance_user_id and m.is_active = 1
left join svk_apt_master_user_role_type r on r.role_type_id = m.user_role_type_id and r.is_active = 1 
left join svk_apt_vendors v on v.vendor_id = m.vendor_id and v.is_active = 1
left join svk_apt_associations a on a.association_id = mp.association_id and a.customer_id = mp.customer_id 
    and a.is_active = 1



where   mp.role_type_id = 8
    and mp.maintenance_role_id = 1

    and (case when mp.customer_id <> 1 and mp.association_id <> 1
              then mp.status_id in(3,5,6,8)
              OR

                    mp.maintenance_user_id IN(                    

                        select mp1.maintenance_user_id
                        from   svk_apt_other_users_associations_mapping mp1
                        WHERE   mp1.customer_id <> 1
                                and mp1.association_id <> 1
                                 AND mp1.maintenance_user_id not IN
                                     (
                                        SELECT mp2.maintenance_user_id
                                        FROM   svk_apt_other_users_associations_mapping mp2
                                        WHERE  mp2.customer_id = 1
                                               and mp2.association_id = 1
                                               and mp2.status_id NOT IN(3,5,6,8)

                                     )





                )    


         else
                false






         end)       


    and mp.is_active = 1

GROUP BY m.maintenance_user_id;

0 个答案:

没有答案