2014-11-08 174 views
1

我的查詢應該返回特定人員的所有入站和出站消息的列表。我工作的Enron Email Dataset in MySQL,在此數據塊相同的消息無法用不同的標籤被複制,如«於»«毫升»«BCC»,是的,這DB是沒有得到很好的酸形成。MySQL中不同行的同一列的值的異或運算

但我想消除這個重複,例如,如果我收到帶有標記««»的消息,我不想看到同一個人發給同一個人的消息,標記爲«cc»。天真的做法是嘗試使用像XOR,這將排除所有重複,但如何讓它工作時,我應該比較不同行的同一列的值?

當前結果爲: query result set example 雖然我期望只看到這兩行中的一行,

那種ERD的,該表的結構,在查詢中使用: Enron Email Dataset partly ERD

查詢的代碼:

SELECT 
    left(m.messagedt, 10) AS 'date', 
    m.messageid   AS 'message id', 
    r.reciptype   AS 'type', 
    m.subject    AS 'message subject', 
    b.body    AS 'message body', 
    s.personid   AS 'sender id', 
    s.name    AS 'sender', 
    s.email    AS 'sender email', 
    t.personid   AS 'receiver id', 
    t.name    AS 'receiver', 
    t.email    AS 'receiver email' 

FROM messages AS m 
    JOIN bodies AS b 
    ON b.messageid = m.messageid 
    JOIN recipients AS r 
    ON r.messageid = m.messageid 
    JOIN people AS t 
    ON t.personid = r.personid 
    JOIN people AS s 
    ON s.personid = m.senderid 

WHERE (
    s.email = '[email protected]' 
    XOR 
    t.email = '[email protected]' 
) 

ORDER BY m.messagedt, 
     m.messageid; 

我會強調,該查詢的目的是獲取已發送給特定用戶或來自特定用戶的所有消息的列表。這就是爲什麼我用JOIN兩次:一個用於入站郵件(人民爲t),一個用於出站(人民爲S)。隨意重新組織查詢。

+0

請告訴我們的表結構(CREATE TABLE查詢) – BreyndotEchse 2014-11-08 13:49:00

+0

可以提供樣本數據和預期在這裏或在sqlfiddle.com結果呢? – 2014-11-08 15:52:51

+0

完整的示例數據:https://s3.amazonaws.com/rjurney_public_web/images/enron.mysql.5.5.20.sql.gz它是數據庫的MySQL轉儲,因爲您已將其上載到MySQL,您可以執行我的查詢或寫你自己的查詢。預期的結果是當我看到同樣的消息時,就像在第一個屏幕截圖中一樣,除了「r.reciptype」的值以外,其值完全相同,可能會有所不同(以/ cc/bcc)來顯示一個(第一個字符串)這些「相同」字符串。 – 2014-11-08 18:09:14

回答

1

您的XOR消除了發件人發送給他自己的電子郵件。這是你真正需要的嗎?

認爲你需要

group by m.messageid, t.email 

,而不是XOR

相關問題