从几个表中获取不同的结果

时间:2013-12-24 00:03:29

标签: mysql sql database select

我需要实现mysql查询来计算用户邮箱使用的空间。 消息线程可能有2方的多条消息(回复,跟进) (发件人/收件人)并标记有一个或多个标签(收件箱,已发送等)。

必须满足以下条件:
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 - 字段subject和body是要计算的字段

    +--------------+------------------+------+-----+---------+----------------+
    | 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 |
    +--------+------+-----------+
    

2 个答案:

答案 0 :(得分:0)

所以,你的问题是IN子句。我不是MYSQL大师,但是在T-SQL中,您可以将其更改为在包含EXISTS的子查询上有一个where子句,因此您的连接不会弹出两行。您需要补偿这样一个事实:您有两行,其中tagID与主要联接数据的每一行相关联。

我可以跨平台的方式使用四个左连接来连接表,然后要求1,2,3或4的非空值。相当低效;我确信在MySQL中有更好的方法,但现在你知道问题是什么,你可能知道更好的解决方案。

答案 1 :(得分: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. midom_msg_message中的om_msg_index是唯一的。