mysql – 将WHERE限制为MAX()和COUNT()
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 将WHERE限制为MAX()和COUNT(),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2569字,纯文字阅读大概需要4分钟。
内容图文
![mysql – 将WHERE限制为MAX()和COUNT()](/upload/InfoBanner/zyjiaocheng/896/8d59c129980343f4acea1c48f0db2d78.jpg)
这是我当前的mySQL查询:
SELECT e.*, MAX(m.datetime) AS unread_last, COUNT(m.id) AS unread
FROM TAB_EVENT e
LEFT JOIN TAB_MESSAGE m ON e.id=m.event_id
WHERE ( m.`read` IS NULL OR m.`read` = 0)
GROUP BY e.id
ORDER BY m.datetime DESC, e.id ASC
LIMIT 10;
我得到:所有TAB_EVENT行根本没有TAB_MESSAGE消息或至少有一个未读消息(read = BOOLEAN DEFAULT 0).
我需要:所有TAB_EVENT行,无论其消息和最新未读的日期时间以及每个TAB_EVENT的未读消息数.
可能有数千个TAB_EVENT行和更多TAB_MESSAGE行,我想避免为每个单个事件运行一个子查询.
备用1:使用上面的查询使用UNION加上另一个m.read = 1的查询.
缺点:两个JOINed繁重查询加上另一个临时表.
备用2:SELECT e.*无条件加上另一个SELECT event_id,MAX(),COUNT()FROM TAB_MESSAGE GROUP BY event_id ORDER BY MAX()并合并调用Perl脚本中的所有内容.
缺点:失去服务器端LIMIT的能力.
UPDATE /解决方案
这是我完成工作的最终查询:
SELECT e.*, m.unread_last, m.unread
FROM
TAB_EVENT e LEFT JOIN
(
SELECT event_id,MAX(`datetime`) AS unread_last, COUNT(*) AS unread FROM TAB_MESSAGE
WHERE `read` = 0
GROUP BY event_id
ORDER BY `datetime` DESC
) m
ON e.id=m.event_id
ORDER BY m.datetime DESC, e.id ASC
LIMIT 10;
读取IS NULL条件捕获原始查询中没有任何消息的事件,读取列是布尔值NOT NULL.
此查询现在返回所有事件,并添加最新的未读消息时间戳加上未读消息的数量.对于没有任何完全正常的消息的事件,两个消息列都是NULL(对于日期时间将被转换为“”,对于Perl端的计数将被转换为0).
感谢RolandoMySQLDBA,我的查询基于他的回答.
解决方法:
这是您在问题中的原始查询
SELECT e.*, MAX(m.datetime) AS unread_last, COUNT(m.id) AS unread
FROM TAB_EVENT e
LEFT JOIN TAB_MESSAGE m ON e.id=m.event_id
WHERE ( m.`read` IS NULL OR m.`read` = 0)
GROUP BY e.id
ORDER BY m.datetime DESC, e.id ASC
LIMIT 10;
也许尝试以这种顺序执行重构查询
>仅从TAB_MESSAGE收集必要的列
>对TAB_MESSAGE中收集的行应用LIMIT 10
>运行JOIN
>最后应用MAX()和COUNT()
这是我提出的建议
SELECT e.*, MAX(m.datetime) AS unread_last, COUNT(m.id) AS unread
FROM
(
SELECT * FROM
(SELECT id,event_id,datetime FROM TAB_MESSAGE
WHERE read IS NULL OR read = 0
ORDER BY datetime DESC) mm
LIMIT 10
) m
LEFT JOIN TAB_EVENT e
ON e.id=m.event_id
ORDER BY m.datetime DESC, e.id ASC;
试试看 !!!
更新2012-02-21 17:06美国东部时间
SELECT e.*, MAX(m.datetime) AS unread_last, COUNT(m.id) AS unread
FROM
TAB_EVENT e LEFT JOIN
(
SELECT * FROM
(SELECT id,event_id,datetime FROM TAB_MESSAGE
WHERE read IS NULL OR read = 0
ORDER BY datetime DESC) mm
LIMIT 10
) m
ON e.id=m.event_id
ORDER BY m.datetime DESC, e.id ASC;
@Sebastian,我把查询放回原来的连接顺序.请试试这个!
更新2012-02-21 17:11美国东部时间
确保将日期时间字段编入索引
ALTER TABLE TAB_MESSAGE ADD INDEX read_datetime_ndx (read,datetime);
内容总结
以上是互联网集市为您收集整理的mysql – 将WHERE限制为MAX()和COUNT()全部内容,希望文章能够帮你解决mysql – 将WHERE限制为MAX()和COUNT()所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。