mysql希望所有结果都来自左表,并且只过滤带有条件的右表

tcomlyy6  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(302)

假设我有票桌:
票务表:
t\u id,注解
票证详情表:票证详情id、票证id、票证、技术
我想这样做,

select
                T.t_id as 'TicektID',
                TK.tk_category as 'Category',
                ifnull(T.contact_person,'N/A') as 'Contact_Person',
                T.comment as 'Employee Comment',
                COUNT(TD.t_detail_id) as 'User Comment',
                T.t_status
                from sun_it_tickets T
                LEFT JOIN (
                SELECT * from sun_it_ticket_categories
                )TK ON TK.tk_id = T.tk_id
                LEFT JOIN sun_it_tickets_detail TD ON TD.t_id = T.t_id
                where TD.tech_viewed = 0
                ORDER BY T.submit_time

其他表也左连接(忽略它)。
我想要的是'sun\u it\u tickets\u detail'表中的行数,其中tech\u view=0。
这将只返回匹配的行仅tech\u viewed=0,但我希望其他结果也“count(td.t\u detail\u id)as'user comment'”,这样,如果没有匹配的结果,将给出count 0。

wtzytmuj

wtzytmuj1#

你需要把条件转移到 on 条款。

select T.t_id as TicektID, TK.tk_category as Category,
       coalesce(T.contact_person, 'N/A') as Contact_Person,
       T.comment as Employee_Comment,
       COUNT(TD.t_detail_id) as num_comments, 
       T.t_status
from sun_it_tickets T left join
     sun_it_ticket_categories tk
     on TK.tk_id = T.tk_id left join
     sun_it_tickets_detail TD 
     on TD.t_id = T.t_id and TD.tech_viewed = 0
group by Category, Contact_Person, Employee_Comment, t_status
order by max(T.submit_time);

笔记:
不要对列别名使用单引号。仅对字符串和日期常量使用单引号。
所有非聚合列都应位于 group by .
我怀疑您选择了太多的列,但是您的问题不清楚您想要什么结果。
这个 order by 应该在一个 group by 列或聚合表达式。 coalesce() 是一个iso/ansi标准函数,所以我更喜欢使用它来替代特定于数据库的函数。

相关问题