获取已排序行的位置

时间:2018-09-22 15:48:15

标签: mysql

如何获得位置,我进行了查询以支持我的搜索结果并正确排序,但是需要获得位置,因为我将创建cron,并且位置行将不时更新。

SELECT
    users.*,
    (SELECT user_like.likes FROM `user_like`
     WHERE user_like.user_id = users.record_num) AS no_likes,
    (SELECT count(*) FROM user_subscription
     WHERE user_subscription.user_id = users.record_num) AS no_subs
FROM users
ORDER BY no_likes DESC,no_subs DESC,views DESC

2 个答案:

答案 0 :(得分:1)

使用会话变量,可以确定行号。以下解决方案适用于所有版本的MySQL(尤其是 <8.0 )。

尝试以下查询:

@row_number

详细信息

  • 在第一条语句中,我们定义了一个名为row_number的变量,并将其值设置为0。row_number是由 @ 前缀指示的会话变量。
  • 在Select语句中,我们将每一行的@RunWith(SerenityRunner.class) public class WhenSearchingOnGoogle { @Managed WebDriver driver; @Test public void shouldInstantiateAWebDriverInstanceForAWebTest() { driver.get("http://www.google.com"); driver.findElement(By.name("q")).sendKeys("firefly", Keys.ENTER); new WebDriverWait(driver,5).until(titleContains("Google Search")); assertThat(driver.getTitle()).isEqualTo("firefly - Google Search"); } } 变量的值增加到1。

答案 1 :(得分:1)

如果您只需要一个行号计数器以及排序后的结果集,我们可以为此使用一个用户变量。但是,您还应该重构查询以使用联接来进行这些聚合,而不是使用相关的子查询:

SET @rn = 0;

SELECT *,
    (@rn:=@rn + 1) AS position
FROM
(
    u.*,
    COALESCE(ul.likes, 0) AS no_likes,
    COALESCE(us.no_subs, 0) AS no_subs
    FROM users u
    LEFT JOIN user_like ul
        ON u.record_num = ul.user_id
    LEFT JOIN
    (
        SELECT user_id, COUNT(*) AS no_subs
        FROM user_subscription
        GROUP BY user_id
    ) us
        ON us.user_id = u.record_num
) t
ORDER BY
    no_likes DESC,
    no_subs DESC,
    views DESC;

请注意,如果您使用的是MySQL 8+或更高版本,则只能使用带有ROW_NUMBER子句的内置分析功能ORDER BY