如果条件存在,则mysql选择distinct

时间:2018-04-22 19:49:56

标签: mysql if-statement select distinct

我有这张桌子:

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
    值为std_dept
  1. ALL表示std_target std_type对所有部门有效

  2. 具有特定dept值的
  3. std_dept覆盖值表单点(1)。

  4. 所以,我的问题是我可以说我来自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'

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

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

听起来你想要加权,所以如果你从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