2012-03-24 31 views
0

我有一個困境。從多個表中選擇數據,其中特定表不包含任何可識別的列?

假設(爲簡單起見)我有四個表,不同數量的行和列,它們分別是:用戶郵件事件服務

當我收到一個請求時,我有一個ID鏈接到其中的三個表上,但有不同的列匹配。 比方說,用戶上USER_ID比賽,郵件比賽user_ref和上user_ref以及匹配事件。

對於我來說,這將是一個很好的查詢,即使是單個,多個或甚至所有的ID。 問題出現在我必須採取的下一步,這就是*服務表。

服務表不符合其他標準的相同標準,因此它沒有可以拉出的user_id或user_ref。 它具有的是* mail_ref *列,它可能包含重複項。 我當前的方法試圖使用IN()方法,但它只適用於選擇單個用戶/行。

這裏是我當前的查詢:

SELECT 
    u.Name as Name, 
    COUNT(m.user_ref) AS Mail_total, 
    e.mail_id, 
    COUNT(e.user_ref) AS Event_total, 
    COUNT(s.mail_ref) AS service_total 
FROM 
    users u 
LEFT JOIN 
    mail m ON m.user_ref = u.user_id 
LEFT JOIN 
    service s ON s.mail_ref IN(e.mail_id) 
LEFT JOIN 
    events e ON e.user_ref = u.user_id 
WHERE u.user_id IN(my,list,of,ids) 
GROUP BY s.mail_ref 

我現在有它的問題是,雖然它是選擇正確的數據,它不是爲我指定每個ID選擇唯一的數據。 給定一個id時,它的工作很好,但如上所述,而不是當它需要檢索多行時。

如果有人可以幫助我,它將不勝感激。

+0

使它成爲'SELECT DISTINCT'來選擇唯一的行並過濾掉雙打,儘管我認爲這個查詢根本不起作用,是嗎? – GolezTrol 2012-03-24 07:28:50

+0

它確實有效,只是不像預期的那樣。它爲所選的所有列返回相同的「COUNT」。 – nand 2012-03-24 13:21:06

回答

1

在服務的左連接中執行子查詢。代替:

LEFT JOIN 服務S ON s.mail_ref IN(e.mail_id)

嘗試

LEFT JOIN (選擇從服務器TOP 1 mail_ref)爲S上s.mail_ref = E .mail_id

看看是否有效。

+0

感謝您的建議,但不幸的是在「服務」中有多行。 – nand 2012-03-24 13:20:45

0
SELECT 
    u.Name as Name, 
    (select count(*) from mail m where m.user_ref = u.user_id) AS Mail_total, 
    e.mail_id, 
    (select count(*) from events e where e.user_ref = u.user_id) AS Event_total, 
    (select count(*) from 
     events e 
     inner join services s on s.mail_ref = e.mail_id 
    where 
     e.user_ref = u.user_id) as service_total 
FROM 
    users u 
WHERE u.user_id IN(my,list,of,ids) 
相關問題