首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用@rownum:=@rownum+1作为rownum枚举SQL中的每条记录。

使用@rownum:=@rownum+1作为rownum枚举SQL中的每条记录。
EN

Stack Overflow用户
提问于 2012-09-25 16:25:49
回答 4查看 3.3K关注 0票数 2

我在MySQL中有这个查询

代码语言:javascript
复制
SELECT 
@rownum:=@rownum+1 AS rownum,
notifications_posts.from_user AS source,
notifications_posts.on_post_id AS destination,
notifications_posts.in_group_id,
groups.group_name AS group_name,
notifications_posts.on_post_id AS other_record_id,
user_info.first_name,
user_info.last_name,
user_info.user_id,
notifications_posts.date,
posts.title AS 'title',
user_rights.right AS 'right',
'article' AS notification_type
FROM notifications_posts
INNER
    JOIN user_info
    ON notifications_posts.from_user = user_info.user_id
INNER
    JOIN posts
    ON posts.id = notifications_posts.on_post_id
INNER
    JOIN groups
    ON groups.group_id = notifications_posts.in_group_id
INNER
    JOIN user_rights
    ON user_rights.group_id = notifications_posts.in_group_id AND user_rights.user_id = user_info.user_id

我得到了

为什么我在rownum上获得NULL

其次,我需要按该id对记录进行分组

代码语言:javascript
复制
GROUP BY rownum;

有谁可以帮我?

EN

回答 4

Stack Overflow用户

发布于 2012-09-25 16:44:26

我认为更可取的做法是对结果进行排序(在MySQL中),然后在应用程序中添加行号。如果你坚持这样做:

警告:任何以这种方式使用变量的查询都可能在未来的MySQL版本中被破坏。

代码语言:javascript
复制
SELECT 
    @rownum := @rownum+1 AS rownum,
    notifications_posts.from_user AS source,
    notifications_posts.on_post_id AS destination,
    notifications_posts.in_group_id,
    groups.group_name AS group_name,
    notifications_posts.on_post_id AS other_record_id,
    user_info.first_name,
    user_info.last_name,
    user_info.user_id,
    notifications_posts.date,
    posts.title AS 'title',
    user_rights.right AS 'right',
    'article' AS notification_type
FROM 
    (SELECT @rownum:=0) AS dummy                  -- initial value
CROSS 
    JOIN notifications_posts
INNER
    JOIN user_info
    ON notifications_posts.from_user = user_info.user_id
INNER
    JOIN posts
    ON posts.id = notifications_posts.on_post_id
INNER
    JOIN groups
    ON groups.group_id = notifications_posts.in_group_id
INNER
    JOIN user_rights
    ON user_rights.group_id = notifications_posts.in_group_id 
    AND user_rights.user_id = user_info.user_id 
ORDER BY                                         -- you need 
    whatever ;                                   -- ORDER BY clause
票数 1
EN

Stack Overflow用户

发布于 2012-09-25 16:27:55

您必须使用(SELECT rownum:=0) r语句初始化变量@rownum

代码语言:javascript
复制
 select  @rownum:=@rownum+1 AS rownum,a.*
     from
     (SELECT 
       notifications_posts.from_user AS source,
       notifications_posts.on_post_id AS destination,
       notifications_posts.in_group_id,
       groups.group_name AS group_name,
       ........
       <remaining query>
       )a,(SELECT @rownum:=0) r 

编辑:所以您的完整查询应该是

代码语言:javascript
复制
SELECT 
@rownum:=@rownum+1 AS rownum,a.*
FROM
(
    SELECT
    notifications_posts.from_user AS source,
    notifications_posts.on_post_id AS destination,
    notifications_posts.in_group_id,
    groups.group_name AS group_name,
    notifications_posts.on_post_id AS other_record_id,
    user_info.first_name,
    user_info.last_name,
    user_info.user_id,
    notifications_posts.date,
    posts.title AS 'title',
    user_rights.right AS 'right',
    'article' AS notification_type
    FROM notifications_posts
    INNER
        JOIN user_info
        ON notifications_posts.from_user = user_info.user_id
    INNER
        JOIN posts
        ON posts.id = notifications_posts.on_post_id
    INNER
        JOIN groups
        ON groups.group_id = notifications_posts.in_group_id
    INNER
        JOIN user_rights
        ON user_rights.group_id = notifications_posts.in_group_id AND user_rights.user_id = user_info.user_id
)a, (SELECT @rownum:=0 )r
票数 0
EN

Stack Overflow用户

发布于 2012-09-25 16:28:04

在按rownum运行query.

  • Grouping之前,
  1. 将rownum设置为0不会有任何影响-每行的rownum都不同。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12578938

复制
相关文章

相似问题

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