2014-10-20 85 views
1

问题是我有DATA和SAT表有3个字段,这些字段中的每一个都可能包含值991.下面的列不给出正确数量的列给出更多数据。如何获得正确的价值。请指点MYSQL查询返回更多的值

DATA 

id 
insurance1 
insurance2 
insurance3 

SAT 
id 
insurance1 
insurance2 
insurance3 

SELECT * FROM DATA v, SAT s where v.PRIMARY_INSURANCE_ID = '991' 
or v.INSURANCE_ID = '991' 
or v.INSURANCE_ID = '991' 
and s.INSURANCE_ID = '991' 
or s.INSURANCE_ID = '991' 
or s.INSURANCE_ID = '991'; 

让我举一个例子 例1

DATA  
    id 
    insurance1 =991 
    insurance2 =56 
    insurance3 =22 

    SAT 
    id 
    insurance1=56 
    insurance2=23 
    insurance3=96 

When query is executed. The count should be 1 

例2

DATA  
    id 
    insurance1 =991 
    insurance2 =56 
    insurance3 =22 

    SAT 
    id 
    insurance1=991 
    insurance2=23 
    insurance3=96 

When query is executed. The count should be 2 

例3

DATA  
    id 
    insurance1 =991 
    insurance2 =56 
    insurance3 =991 

    SAT 
    id 
    insurance1=991 
    insurance2=23 
    insurance3=96 

When query is executed. The count should be 3 or 2 
+0

DATA ID insurance1 = 991 insurance2 = 56 insurance3 = 36 – CodingPerson 2014-10-20 12:21:36

回答

0

你有两个表格,你想在其中计数991。所以这些表格不一定是相关的,一个连接是没有意义的。只需添加的两项罪名:

select 
    (select count(*) from data where 991 in (insurance1, insurance2, insurance3)) 
    + 
    (select count(*) from sat where 991 in (insurance1, insurance2, insurance3)); 

BTW:混合AND和OR时:-)

+0

该查询未提供期望的结果。 – CodingPerson 2014-10-20 13:12:10

+0

那么你想要什么结果呢?如果你有3个数据记录有991和4个有991的sat记录,它会给你3 + 4 = 7。你期望什么数字呢? – 2014-10-20 13:14:54

+0

我的歉意,你是正确的,这是返回所需的价值和价值。我错误地计算了行数。非常感谢:) – CodingPerson 2014-10-20 13:46:14

2

我建议改写以此为join

SELECT * 
FROM DATA v JOIN 
    SAT 
    ON '991' in (v.PRIMARY_INSURANCE_ID, v.INSURANCE_ID) AND 
     '991' in (s.INSURANCE_ID) 

您的查询只提及三个字段。您可以扩展in列表以获得所需的所有列。根据你的表结构:

SELECT * 
FROM DATA v JOIN 
    SAT 
    ON '991' in (v.INSURANCE1, v.INSURANCE2, v.INSURANCE3) AND 
     '991' in (s.INSURANCE1, s.INSURANCE2, s.INSURANCE3); 

编辑:

我不认为你想join都:

select count(*), count(distinct id) 
from (select id, insurance1 as insurance from data union all 
     select id, insurance2 from data union all 
     select id, insurance3 from data union all 
     select id, insurance1 from sat union all 
     select id, insurance2 from sat union all 
     select id, insurance3 from sat 
    ) i 
where insurance = '991'; 

使用count(*)拿到3和count(distinct id)获得2注:后者假定id在表格之间匹配。

+0

+1,伟大的答案要当心! – SagarPPanchal 2014-10-20 12:17:57

+0

即使DATA保险1的值为991,也会返回零记录。请通知 – CodingPerson 2014-10-20 12:20:49

+0

这要求每个表中的一列中包含“991”。所以,我猜测'SAT'中没有这样的行。 – 2014-10-20 12:21:46