创建一个条件选择

时间:2011-06-06 05:58:17

标签: mysql select

我有一个表格,记录每个月为不同产品分配给不同员工的目标,并且它有一个状态字段,用于记录分配的目标是否已被批准。

status - 1>>待定,2>>已批准

例如:

pdt_id month emp_id status
1        04   1       2
2        04   2       2
3        04   3       1

1        05   1       2
2        05   2       2
3        05   3       2

现在我想生成一个报告,显示唯一没有待批准的月份。即根据上述数据,报告应仅显示'05',因为它是所有请求获得批准的唯一月份

如果我提供条件选择月份,其中status ='2'它将同时获取04和05但我只想获取05 ...

恳求

5 个答案:

答案 0 :(得分:2)

SELECT month
  FROM myTable
  WHERE month NOT IN (
    SELECT month
    FROM myTable
    WHERE status = 1
  )

答案 1 :(得分:1)

LEFT JOIN表格自身找出匹配并消除它们。

SELECT 
  t1.`month` 
FROM
  your_table AS t1 
  LEFT JOIN your_table AS t2 
    ON t1.`month` = t2.`month` 
    AND t2.`status` = 1 
WHERE t2.month IS NULL
GROUP BY t1.month 

这可能有更优雅的方法,但它可以完成工作。

答案 2 :(得分:0)

您可以选择没有州待处理的月份:

select month from table_name as tb1 where 0 = (select count(*) from table_name as tb2 where tb2.state = '1' AND tb1.month = tb2.month)

答案 3 :(得分:0)

仅限Approved状态的月份:

SELECT DISTINCT month
FROM myTable a
WHERE NOT EXISTS
  ( SELECT *
    FROM myTable b
    WHERE a.month = b.month
      AND b.status <> 2
  )

没有任何Pending的月份:

SELECT DISTINCT month
FROM myTable a
WHERE NOT EXISTS
  ( SELECT *
    FROM myTable b
    WHERE a.month = b.month
      AND b.status = 1
  )

通常有3种方法可以解决此类问题,(使用NOT EXISTS,使用NOT IN并使用LEFT JOIN进行NULL检查)。您已经有其他两种方式的答案。

在这种特殊情况下,还有另一种(第四种)方式。如果您从未计划添加比12更多的状态,那么这也会有效:

SELECT month
FROM myTable
GROUP BY month
HAVING MIN(status) = 2

最后的评论/问题。您是否只在表格中存储month,而不是year?因为如果您还有一个year字段,那么一旦您在表格中有超过一年的数据,查询就不会显示正确的结果。

答案 4 :(得分:-1)

我不明白你为什么不这样做?

... WHERE month = "05" AND status = 2;

如果您有另一个“已批准”的概念,为什么不将其添加为列并将其包含在查询中呢?

有时修理一件事意味着重新设计你的桌子。