2013-07-02 46 views
0

从3个不同的表中,我想知道在商店(表2)中多次访问的人(table1)是否购买了玩具并享受它们(表3)。在表3中,0表示否定(所以不享受)或不买。 1代表积极的。每次访问都有自己的身份证号码。使用SQL排除来自多个值的空条目

我的问题是,对于table1中的每个ID,我有多个table2的条目,对于table3我有多个条目,并且只有其中一个为空。

Person  Visit     Toy 
ID age Number Visit ID  number name value 
1 12  1  1  1  1  Plane 
2 10  2  1  2  1  Train 1 
      3  2  1  2  Plane 1 
      4  2  2  2  Train 0 
            3  Plane 0 
            3  Train 1 
      (goes on for every id) (goes on for every visit) 

我想知道有多少人喜欢某种玩具。但是,由于我有一些空的信息,所以我在遇到这些问题时遇到了一些麻烦,因为我只对他们的访问都有价值。例如,下面的代码仅适用于仅在其中一次访问时放置空条件的情况

Select p.id, max(toy.value) as value 
from person p 
join visit v on p.id = v.id 
join toy t on v.number = t.number 
where 
((t.name='plane' and v.visit=1) 
or (t.name='plane' and v.visit=2)) 
and (
    (v.visit=1 and ((t.value=1 or t.value=0) is not null)) 
    ---and (v.visit=2 and ((t.value=1 or t.value=0) is not null)) 
    ) 
group by p.id 
order by p.id 

我已经尝试了很多写这种方法。如果我单独尝试两个空条件,但它确实有效,但是如果我删除--并尝试访问1和2的条件,则不起作用。请注意,我对该值使用了最大值,因为我想要一个正值。

回答

0

如果你想知道有多少人都享有一定的玩具,那么你可以简单地写:

select count(*) from toy t where t.name='TOY NAME' and t.level=1; 

如果你想要别的东西。然后好心澄清。

编辑查询,

Select p.id, max(toy.value) as value 
from person p 
join visit v on p.id = v.id 
join toy t on v.number = t.number 
where 
t.name='plane' 
and t.value is not null 
group by p.id 
order by p.id 
+0

在我的表中,我有更多然后只是2次访问,所以这就是为什么我指定了其中2个。另外,不要只有那些只有1的人,但他们都是。最大值是显示两者中最高的。我正在寻找那些有两次访问的条目。在t.value = 1(或0)的情况下,您不扫描空条目 – Renaud

+0

您是否可以在**访问**表中澄清列**号**和**访问**的含义。 –

+0

只是访问的Id和访问者的第n次访问 – Renaud

0

我用计数的方式来消除所有的空项。空值和值之和始终为空,因此通过添加限制count=2它消除空