2014-10-20 86 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