【问题标题】:Left outer join? Row numbering issue左外连接?行号问题
【发布时间】:2013-07-31 04:27:35
【问题描述】:

我有三个表,一个表有主题,一个表用于用户数据,一个表用于存储用户订阅。

一个用户可能/不订阅它的可选,所以要获取所有用户列表及其订阅状态,我使用左连接作为

SET @rnum = 0;

SELECT (@rnum :=@rnum + 1) AS rn, user.user_name, subs.status 
FROM user_tbl LEFT JOIN subs_tbl ON user.uid = subs.uid LIMIT 0, 10;

我一次使用整个输出,但现在随着数据的增长,我已经在我的应用程序中实现了这个输出的分页。

对于分页,我创建了一个 row_num 机制,我将存储最后显示的 row_num,并且在下一页将从 last_num 开始显示。

现在我想对订阅的用户进行排序,首先或最后订阅,所以我使用了

SELECT (@rnum :=@rnum + 1) AS rn, user.user_name, subs.status
FROM user_tbl LEFT JOIN subs_tbl ON user.uid = subs.uid ORDER BY subs.status LIMIT 0, 10;

这是给出行号但不是我想要的,它先给出行号然后进行排序,所以我没有得到想要的结果。

所以我需要帮助,

  1. 有更好的分页方式吗?
  2. Left Join 是否有任何替代(我也想要空值,因为我想要所有用户信息)。
  3. 是否有其他方法可以对 SQL 结果进行编号。
  4. 在这种情况下,有没有关于函数的 PHP 或任何可以帮助我的东西。

[这是根据我的实际问题创建的示例,在我的实际问题中,我有一个包含多个连接和子查询的巨大查询,因此无法嵌套此查询和编号]

【问题讨论】:

  • 这是如何给出行号的?
  • 我的错误,忘了说,现在更新问题检查。
  • 您需要使用limit clause 以获得更好的分页。
  • 我实际使用过,这里也添加了。
  • 无论如何解决了,使用不同的概念。不在这里发帖,因为它与我的问题没有太大关系,但对于我的实际问题,它具有魅力。

标签: mysql sql join left-join row-number


【解决方案1】:

也许你正在寻找这样的东西:

(由于不符合 OP 的要求而被删除,如评论所提醒。)

或者,您也可以尝试对LIMIT 进行参数化。从 MySQL 5.0.7 开始,LIMIT is parametrisable 在作为存储过程或预准备语句一部分的语句中使用时:

PREPARE stmt FROM
'SELECT
...
LIMIT ?, ?';

EXECUTE stmt USING @offset, @limit;

值得注意的是,对于这种方法,具有尽可能明确的排序顺序是最有意义的。

【讨论】:

  • 对于案例 1:正如我在问题中提到的,我无法嵌套查询。
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多