mysql组和过滤结果

时间:2015-07-17 12:39:55

标签: php mysql

我有2个查询!

select LINE, ACCOUNT
from DATAS
where date between "2015-07-01" and "2015-07-15" 
and SIG="in"
group by ACCOUNT
order by ACCOUNT

select LINE, ACCOUNT
from DATAS
where date between "2015-07-01" and "2015-07-15" 
and SIG="out"
group by ACCOUNT
order by ACCOUNT

示例结果:

LINE-ACCOUNT, SIG
0-1309  IN
0-1331  IN
0-1340  IN
0-1361  IN
0-1404  IN
0-1555  IN

LINE-ACCOUNT, SIG
0-1098  OUT
0-1309  OUT
0-1322  OUT
0-1331  OUT
0-1340  OUT
0-1555  OUT

我想要2个会产生结果的查询:

  1. 向我提供“有”标志的帐户,但它没有“出”标志!
  2. 向我提供有“out”标志的帐户,但它没有“in”标志!
  3. 我在excel中解决了它,但是它太复杂了,无法解决它日复一日! ;)

    如果更容易我也接受php中的解决方案!

    我希望你明白我的意思!

    提前致谢

1 个答案:

答案 0 :(得分:0)

你尝试过这样的事吗?

select * from 
(
    (select LINE, ACCOUNT, SIG
    from DATAS
    where date between "2015-07-01" and "2015-07-15" 
    and SIG="in"
    group by ACCOUNT
    order by ACCOUNT)
    union all
    (select LINE, ACCOUNT, SIG
    from DATAS
    where date between "2015-07-01" and "2015-07-15" 
    and SIG="out"
    group by ACCOUNT
    order by ACCOUNT)
) t1
group by LINE, ACCOUNT
having count(Line) = 1

编辑:更正了查询

编辑:这里是关于查询如何工作的简要说明。首先,我们选择SIG =' IN' ...然后我们追加SIG =' OUT'。

的所有行。

现在是它变得有趣的地方。如果一行同时具有IN和OUT语句,它将在我们当前的结果集中出现两次,因为它将成为SIG =" IN"的一部分。和SIG =" OUT"查询。另一方面,只有一个" IN"或者" OUT"只会出现在两个内部查询之一中。我们将利用这一点。

外部选择语句及其"组由LINE,ACCOUNT"声明展平我们的结果集,从而允许我们使用count()函数。如果两个查询中都出现一行,则count()将等于2 ...另一方面,如果一行只出现在两个查询之一中,则count()将等于1。这些是我们想要的。

但是,在SQL中,你无法做到:

select * from table where count() > 1

如果要使用聚合函数放置条件,则必须使用"使用"条款,放在"组后面的"声明和行为完全类似于"其中",只有聚合函数。