我有一个查询,它列出了我们网站上“页面”的I。
SELECT mdl_page.id
FROM mdl_page, mdl_log, mdl_user
WHERE mdl_log.module = "page"
AND mdl_log.action = "view"
AND mdl_user.id = mdl_log.userid
AND mdl_log.info = mdl_page.id
AND mdl_log.course = 178结果很简单:
| ID |
|-----|
| 3 |
| 4 |
| 7 |
| 11 |注意计数中的跳跃。我想得到这样的东西:
| ID | NEXT ID |
|-----|---------|
| 3 | 4 |
| 4 | 7 |
| 7 | 11 |
| 11 | 12 |有人能指出我的正确方向吗?
更新
一个问题是,系统(不是我自己的)--我必须运行这个查询--只允许以'SELECT‘开头的查询。
发布于 2014-08-28 17:45:18
我可以想出两种方法来使用与之相关的子查询,在您的子查询中,比较来自主查询的值,然后以升序的方式对其进行排序,并将结果限制为一个。
SELECT
p.id ,
(SELECT
p1.id
FROM mdl_page p1
JOIN mdl_log l1 ON (l1.info = p1.id)
JOIN mdl_user u1 ON (u1.id = l1.userid)
WHERE l1.module = "page"
AND l1.action = "view"
AND l1.course = 178
AND p1.id > p.id
ORDER BY p1.id ASC LIMIT 1) NEXT_ID
FROM mdl_page p
JOIN mdl_log l ON (l.info = p.id)
JOIN mdl_user u ON (u.id = l.userid)
WHERE l.module = "page" AND l.action = "view" AND l.course = 178
ORDER BY p.id 使用秩查询,在秩查询中,我将使用小于条件的ON (t.id< t1.id)加入相同的查询,因此它将导致多行,如( 3,4 )、(3,7)、(3,11),因此我需要选择第一个3,4的组合,为此,我使用了一个秩查询给属于同一组的项的排序,在父类中,我只是将结果集限制为显示每个组的第一对。
SELECT t3.id,t3.NEXT_ID FROM (
SELECT t.id id, t1.id NEXT_ID ,
@r:= CASE WHEN @g = t.id THEN @r +1 ELSE 1 END rownum,
@g:= t.id
FROM
(SELECT
p.id
FROM
mdl_page p
JOIN mdl_log l ON (l.info = p.id)
JOIN mdl_user u ON (u.id = l.userid)
WHERE l.module = "page"
AND l.action = "view"
AND l.course = 178
ORDER BY p.id
) t
LEFT JOIN
(SELECT
p.id
FROM
mdl_page p
JOIN mdl_log l ON (l.info = p.id)
JOIN mdl_user u ON (u.id = l.userid)
WHERE l.module = "page"
AND l.action = "view"
AND l.course = 178
ORDER BY p.id ) t1 ON (t.`id` < t1.id)
CROSS JOIN (SELECT @g:=0,@r:=0) t2
ORDER BY t.`ID` , t1.ID
) t3
WHERE t3.rownum = 1如果没有更多的id大于11的记录存在,或者换句话说,最后一条记录将在next_id列中为空,那么您将获得11的空值。
ID NEXT_ID
3 4
4 7
7 11
11 NULL发布于 2014-08-28 17:25:04
也许您应该创建一个临时表,它与正在运行和删除第一行的查询基本相同。
然后运行您的查询并将其与临时表连接?
https://stackoverflow.com/questions/25554225
复制相似问题