【问题标题】:mysql select distinct if condition exists如果条件存在,mysql select distinct
【发布时间】:2018-10-02 20:24:47
【问题描述】:

我有这张桌子:

std_id  std_type  std_dept  target
  1      type-1     ALL       15
  2      type-1     HRD       10
  3      type-2     ALL       1
  4      type-2     ACCTG     5
  5      type-3     ALL       5
  6      type-4     ALL       25
  1. std_dept 的值为ALL 表示每个std_targetstd_type 对所有部门都有效

  2. std_dept 具有特定的部门值,覆盖值形式点 (1)。

所以,我的问题是假设我来自 HRD 部门,我希望结果集如下:

std_id  std_type  std_dept  target
  2      type-1     HRD       10
  3      type-2     ALL       1
  5      type-3     ALL       5
  6      type-4     ALL       25

我真的很喜欢展示我的作品,但我一点头绪都没有,我不知道如何区分select * from std_table (for each std_type) where std_dept='HRD' if exist else get from std_dept='ALL'

如果不是代码,我需要指针

【问题讨论】:

    标签: mysql if-statement select distinct


    【解决方案1】:

    您可以使用NOT EXISTS 和相关子查询:

    SELECT *
    FROM tab
    WHERE std_dept = 'HRD'           
    UNION ALL
    SELECT *
    FROM tab t1
    WHERE std_dept = 'ALL'
      AND NOT EXISTS (SELECT *
                      FROM tab t2
                      WHERE t2.std_dept = 'HRD'   
                        AND t1.std_type = t2.std_type);
    

    DBFiddle Demo

    【讨论】:

    • 感谢@lad2025 的回复,我会尽快尝试。再次感谢
    【解决方案2】:

    听起来你想加重它,所以如果你来自 HRD,那么你想要 HRD 或 ALL,如果你想要 ACCTG,那么你想要 ACCTG 或 ALL,类型 1-4。

    您可以按 std_type 分组以使它们不同,并按其排序以使顺序正确。对于权重,您可以创建一个列,该列是与您在 WHERE 子句中使用的相同值进行比较的结果,例如类似:

    SELECT std_id, DISTINCT(std_type) AS std_type,
           std_dept, target, 
           IF (std_dept = 'HRD', 50, 10) AS weight
    FROM mytable
    WHERE std_dept IN ('ALL', 'HRD')
    GROUP BY std_id, std_dept, target, weight
    ORDER BY std_type
    

    【讨论】:

    • 感谢您的回答,我遇到了一个错误,由于我是 mysql 新手,我不知道如何解决这个问题。
    猜你喜欢
    • 2015-07-20
    • 2011-11-16
    • 2015-01-28
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多