我需要实现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;
表格的结构:
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 | |
+--------------+------------------+------+-----+---------+----------------+
om_msg_index
+-----+-----------+-----------+--------+--------+---------+
| mid | thread_id | recipient | author | is_new | deleted |
+-----+-----------+-----------+--------+--------+---------+
| 1 | 1 | 1392 | 1211 | 0 | 0 |
| 2 | 1 | 1211 | 1392 | 1 | 0 |
+-----+-----------+-----------+--------+--------+---------+
om_msg_tags_index
+--------+------+-----------+
| tag_id | uid | thread_id |
+--------+------+-----------+
| 1 | 1211 | 1 |
| 4 | 1211 | 1 |
| 1 | 1392 | 1 |
| 4 | 1392 | 1 |
+--------+------+-----------+
答案 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
我假设:
user_id
是参数标记/主变量,正在为单个用户查询。GROUP BY
条款带给您的内容)。mid
和om_msg_message
中的om_msg_index
是唯一的。