2013-12-24 71 views
0

我需要執行mysql查詢以計算用戶郵箱使用的空間。 消息線程可能由兩方 (發件人/收件人)擁有多個郵件(回覆,跟進),並標記有一個或多個標記(收件箱,發件等)。從幾個表中獲取不同的結果

必須滿足以下條件:
a)用戶是消息的收件人或作者;
b)消息由任何標籤標記:1,2,3,4;
c)中不同的僅記錄,即如果線程,包含消息標記有 4分的標籤(例如圖1和4的多於一個:收件箱和已發送)的計算 是在一個標籤僅

完成

我曾嘗試下面的查詢,但我沒能獲得不同的值 - 該 主題/值複製:

SELECT SUM(LENGTH(subject)+LENGTH(body)) AS sum 
FROM om_msg_message omm 
JOIN om_msg_index omi ON omm.mid = omi.mid 
JOIN om_msg_tags_index omti ON omi.thread_id = omti.thread_id AND omti.uid = user_id 
WHERE (omi.recipient = user_id OR omi.author = user_id) AND omti.tag_id IN (1,2,3,4) 
GROUP BY omi.mid; 

表的結構:

  1. om_msg_message - 字段標題和正文都被計算

    +--------------+------------------+------+-----+---------+----------------+ 
    | Field  | Type    | Null | Key | Default | Extra   | 
    +--------------+------------------+------+-----+---------+----------------+ 
    | mid   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
    | subject  | varchar(255)  | NO |  | NULL |    | 
    | body   | longtext   | NO |  | NULL |    | 
    | timestamp | int(10) unsigned | NO |  | NULL |    | 
    | reply_to_mid | int(10) unsigned | NO |  | 0  |    | 
    +--------------+------------------+------+-----+---------+----------------+ 
    
  2. om_msg_index

    +-----+-----------+-----------+--------+--------+---------+ 
    | mid | thread_id | recipient | author | is_new | deleted | 
    +-----+-----------+-----------+--------+--------+---------+ 
    | 1 |   1 |  1392 | 1211 |  0 |  0 | 
    | 2 |   1 |  1211 | 1392 |  1 |  0 | 
    +-----+-----------+-----------+--------+--------+---------+ 
    
  3. om_msg_tags_index

    +--------+------+-----------+ 
    | tag_id | uid | thread_id | 
    +--------+------+-----------+ 
    |  1 | 1211 |   1 | 
    |  4 | 1211 |   1 | 
    |  1 | 1392 |   1 | 
    |  4 | 1392 |   1 | 
    +--------+------+-----------+ 
    
+0

考慮提供適當的DDL和/或sqlfiddle連同SET – Strawberry

回答

0

這裏的另一個解決方案:

SELECT SUM(LENGTH(omm.subject) + LENGTH(omm.body)) as totalLength 
FROM om_msg_message omm 
JOIN om_msg_index omi 
    ON omi.mid = omm.mid 
    AND (omi.recipient = user_id OR omi.author = user_id) 
JOIN (SELECT DISTINCT thread_id 
     FROM om_msg_tags_index 
     WHERE uid = user_id 
      AND tag_id IN (1, 2, 3, 4)) omti 
    ON omti.thread_id = omi.thread_id 

我假設:

  1. user_id是一個參數標記/主變量,被查詢爲單個用戶。
  2. 您希望每個用戶的所有消息的總數,而不是每個消息的總長度(這是您的版本中的GROUP BY子句獲得的)。
  3. ,在這兩種om_msg_messageom_msg_indexmid是獨一無二的。
+0

它確實有用,非常感謝! – Oleg

0

所以,你的問題中的人條款。我不是MYSQL專家,但是在T-SQL中,您可以將其更改爲在包含EXISTS的子查詢上具有where子句,以便您的連接不會彈出兩行。您需要補償這樣一個事實,即您有兩行不同的tagID與主連接數據的每一行相關聯。

我可以做到這一點的跨平臺將與雙向四左聯接該鏈接的表則要求一個非空值1,2,3,或4相當低效的;我相信在MySQL中有更好的方法來實現它,但現在你知道問題是什麼,你可能會知道一個更好的解決方案。

+0

庵所期望的結果,則'WHERE子句EXISTS'是SQL標準的一部分,並且很可能會比'LEFT JOIN's更有效。但是,您對這個問題的診斷是現成的。 –

+0

@Dylan感謝您的幫助!我使用Clockwork-Muse的解決方案,因爲它確實爲我解決了問題。 – Oleg

相關問題