【问题标题】:How to retrieve data from table with conditions?如何从有条件的表中检索数据?
【发布时间】:2019-06-29 16:57:20
【问题描述】:

我正在开发 mysql 服务器中的数据库视图,以通过将 grns 加入评论表来获取 grns 的状态。我想显示 grn 被拒绝或批准。评论表上可能有多个用于单个 grns 的 cmets。

如果grn的comment table status中只有一个“Approval”,则grn的状态必须返回为“Approved”,否则为“Rejected”或“Pending” 这是两个表的虚拟。

预期结果:

G1 - rejected
G2 - approved
G3 - approved
G4 - approved
G5 - approved

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以通过测试comment 中是否存在行来执行此操作,每个grn-no 值的状态为approvedrejected。如果grn 既未被批准也未被拒绝,则状态设置为pending

    SELECT g.`grn-no`,
           CASE WHEN EXISTS (SELECT * FROM comment c WHERE c.grn_id = g.id AND c.status = 'approved') THEN 'approved'
                WHEN EXISTS (SELECT * FROM comment c WHERE c.grn_id = g.id AND c.status = 'rejected') THEN 'rejected'
                ELSE 'pending' END AS status
    FROM grn g    
    

    输出:

    grn-no  status
    G1      rejected
    G2      approved
    G3      approved
    G4      approved
    G5      approved
    

    Demo on dbfiddle

    【讨论】:

      【解决方案2】:

      您可以使用correlated subquery

      select concat(grn_no,
                    ' - ',
                    coalesce((select status
                               from comment
                              where status = 'approved'
                                and grn_id = g.id
                              group by grn_id),
                             'rejected')) "Result"
        from grn g
      

      Demo

      【讨论】:

      • pending 的情况如何处理?
      • 我认为这意味着可能存在“待定”状态以及“已拒绝”状态。例如,如果 grn 只有 concession 状态
      • 我想时间会证明谁的假设是有效的! :)
      • @MD40 不客气的朋友,我们在猜测我们应该带来什么样的风格 :)。顺便说一句,请共享文本数据作为您未来问题的示例输出。比图片更容易操作它们。
      • @BarbarosÖzhan -我能理解你的意思,下次我会按照指示进行的。
      【解决方案3】:

      你可以使用group_concat(flatten)函数

      Select
      `grn-no`, 
      Case when status like ('%approved%') then 'approved' else 'rejected' end as status 
      From
      (Select  
      `grn-no`, 
       group_concat(status) as status 
       From grn 
       left join comment 
       on grn.id = comment.grn_id  
       group by 1) a
      

      【讨论】:

        【解决方案4】:

        最后我找到了上面代码后面的所有函数。上面的问题是开发下面的数据库视图。

        CREATE OR REPLACE VIEW summery AS
        
            SELECT
            g.id,
            g.supply_date,
            g.grn_no,
            COUNT(b.bag_no) AS bags,
            CONCAT(s.fname," ", s.lname) AS name,
            SUM(b.weight) AS qty,
            AVG(b.bag_mc) AS mc,
            (g.dust_initial/g.dust_weight)*100 AS dust,
            (g.ubs_initial/g.ubs_weight)*100 AS ubs,
            p.fraction_1 AS fraction_1,
               CASE
                WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'approved') THEN 'Approved'
                WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'approved with concession') THEN 'Approved with Concession'
                WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'concession required') THEN 'Concession Required'
                WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'rejected') THEN 'Rejected'
               ELSE 'pending' END AS status
        FROM grns g
            JOIN suppliers s ON s.id = g.supplier_id
            JOIN psds p ON g.id = p.grn_id
            JOIN bags b ON g.id = b.grn_id
        GROUP BY g.id
        ORDER BY g.id DESC
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-08
          • 2010-11-29
          • 2015-01-19
          • 1970-01-01
          • 2018-02-10
          • 2012-09-09
          相关资源
          最近更新 更多