首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询:选择并显示下一个最高值作为新列

查询:选择并显示下一个最高值作为新列
EN

Stack Overflow用户
提问于 2014-08-28 17:01:25
回答 2查看 191关注 0票数 1

我有一个查询,它列出了我们网站上“页面”的I。

代码语言:javascript
复制
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

结果很简单:

代码语言:javascript
复制
|  ID |
|-----|
|  3  |
|  4  |
|  7  |
|  11 |

注意计数中的跳跃。我想得到这样的东西:

代码语言:javascript
复制
|  ID | NEXT ID |
|-----|---------|
|  3  |    4    |
|  4  |    7    |
|  7  |    11   |
|  11 |    12   |

有人能指出我的正确方向吗?

更新

一个问题是,系统(不是我自己的)--我必须运行这个查询--只允许以'SELECT‘开头的查询。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-28 17:45:18

我可以想出两种方法来使用与之相关的子查询,在您的子查询中,比较来自主查询的值,然后以升序的方式对其进行排序,并将结果限制为一个。

代码语言:javascript
复制
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的组合,为此,我使用了一个秩查询给属于同一组的项的排序,在父类中,我只是将结果集限制为显示每个组的第一对。

代码语言:javascript
复制
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的空值。

代码语言:javascript
复制
ID  NEXT_ID
3   4
4   7
7   11
11  NULL
票数 1
EN

Stack Overflow用户

发布于 2014-08-28 17:25:04

也许您应该创建一个临时表,它与正在运行和删除第一行的查询基本相同。

然后运行您的查询并将其与临时表连接?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25554225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档