我有这个查询,它列出了我们网站上“页面”的 ID。
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 |
任何人都可以为此指出正确的方向吗?
gia hạn
一个转折点,我必须运行查询的系统(不是我自己的)只允许以“SELECT”开头的查询。
我能想到的两种使用相关子查询的方法,在你的子查询中比较主查询的值并按升序排序并将结果限制为一个
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.
的相同查询编号 < 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
resutset 如果不存在 id 大于 11 的记录,则 11 的值为 null,或者换句话说,最后一条记录在 next_id 列中为 null
ID NEXT_ID
3 4
4 7
7 11
11 NULL
Tôi là một lập trình viên xuất sắc, rất giỏi!