免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2784 | 回复: 11
打印 上一主题 下一主题

一个MySQL query的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-02 14:13 |只看该作者 |倒序浏览
我想把table_one里log_type_id是81和82的timestamp的差拿出来(timestamp 82 - timestamp 81, 前提是abclog_id是一样的), 而abclog_id是从另外table_two提出来, 大概就是(select abclog_id from table_two where ....).
有什么办法可以一个QUERY里做到吗? 如果我还想把table_two 里的uid 也提出来呢.

例如这就是我想要的结果(当然, 真正的结果可能是很多页的):
|-----+
|time|
|-----+
|2479|
|-----+

或是
------------+
| uid | time|
+-----------+
| 2479| 2479|
-------------

table_one
+-----------+-------------+---------+------------+
| abclog_id | log_type_id | id     | timestamp |
+-----------+-------------+---------+------------+
| 247927204 |       81 |   10904 | 3680400000 |<--81
| 247927204 |       82 |   11160 | 3680402479 |<--82
| 247927204 |       83 |   11175 | 3680972384 |
| 247927204 |       84 |   11189 | 3681492382 |
| 247927289 |       85 |   11204 | 3682317381 |
-------------------------------------------------

table_two
+-----------+-------------+
| uid | abclog_id | others|
+-----------+-------------+
| 2479| 247927204 | xxxxx |
---------------------------

[ 本帖最后由 learnscript 于 2008-3-3 10:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-03-03 09:12 |只看该作者
abclog_id是和什么字段对应的?

论坛徽章:
0
3 [报告]
发表于 2008-03-03 09:57 |只看该作者

回复 #1 learnscript 的帖子

给出的条件不够啊。
楼主能保证table_one中相同的abclog_id只出现两次吗?能保证很简单,不能保证的话就麻烦了。

论坛徽章:
0
4 [报告]
发表于 2008-03-03 10:21 |只看该作者

回复 #2 yueliangdao0608 的帖子

所有名字带'id'的都是32bit的integer

论坛徽章:
0
5 [报告]
发表于 2008-03-03 10:25 |只看该作者
原帖由 sunnyfun 于 2008-3-3 09:57 发表
给出的条件不够啊。
楼主能保证table_one中相同的abclog_id只出现两次吗?能保证很简单,不能保证的话就麻烦了。


不能, 只能保证, 同一abclog_id中, ,log_type_id是81或是82的要么不在, 要么只出现一次.  有81不一定有82, 但有82就一定有81.
table_one
+-----------+-------------+---------+------------+
| abclog_id | log_type_id | id     | timestamp |
+-----------+-------------+---------+------------+
| 247927204 |       81 |   10904 | 3680400000 |<--81
| 247927204 |       82 |   11160 | 3680402479 |<--82
| 247927204 |       83 |   11175 | 3680972384 |
| 247927204 |       84 |   11189 | 3681492382 |
| 247927289 |       85 |   11204 | 3682317381 |
-------------------------------------------------

论坛徽章:
0
6 [报告]
发表于 2008-03-03 10:30 |只看该作者
如果只把log_type_id是81的拿出来,

  1. select timestamp from table_one where abclog_id in
  2. (select abclog_id from table_two where ...)
复制代码

不过我要做的复杂很多, 例如这81不一定有相对应的82.

论坛徽章:
0
7 [报告]
发表于 2008-03-03 10:56 |只看该作者

回复 #5 learnscript 的帖子

哦,改需求了,我预料中的麻烦开始了:
log_type_id等于81和82代表什么?
为什么需要的是(timestamp 82 - timestamp 81),而不是(timestamp 83 - timestamp 82),甚至(timestamp 83 - timestamp 81),等等,不定出一个范围的话,可能性将是指数级的。

论坛徽章:
0
8 [报告]
发表于 2008-03-03 11:04 |只看该作者
原帖由 sunnyfun 于 2008-3-3 10:56 发表
哦,改需求了,我预料中的麻烦开始了:
log_type_id等于81和82代表什么?
为什么需要的是(timestamp 82 - timestamp 81),而不是(timestamp 83 - timestamp 82),甚至(timestamp 83 - timestamp 81),等等,不 ...

哦, 打个比喻, 81代表用户登陆, 82代表某个行动, 而其它83/84代表其它行动. 我现在只关心用户在81和82之间花了多少时间.

论坛徽章:
0
9 [报告]
发表于 2008-03-03 12:31 |只看该作者
可以做到, 不过效率很低:
这里只是把东西提出来, 没有计算, 不过离目标近了一步.
select a3.uid, a1.abclog_id from
(select abclog_id from table_one where log_type_id=81) a1,
(select abclog_id from table_one where log_type_id=82) a2,
(select abclog_id, uid from table_two  where ...) a3,
where a1.abclog_id=a2.abclog_id and a1.abclog_id=a3.abclog_id

40957 rows in set (41 min 41.91 sec)

可以想象, 如果是4百万行呢.

论坛徽章:
0
10 [报告]
发表于 2008-03-03 12:48 |只看该作者
SELECT a.abclog_id, (endTimestamp - startTimestamp) AS time, c . *
FROM (
    SELECT abclog_id, timestamp AS startTimestamp
    FROM `table_one`
    WHERE log_type_id =81
    GROUP BY abclog_id
)a
LEFT JOIN (
    SELECT abclog_id, timestamp AS endTimestamp
    FROM `table_one`
    WHERE log_type_id =82
    GROUP BY abclog_id
    )b ON a.abclog_id = b.abclog_id
LEFT JOIN table_two c ON a.abclog_id = c.abclog_id


涉及到字段计算,不会很快,不过应该不至于41分钟这么离谱吧,楼主自己好好优化一下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP