如何获得位置,我进行了查询以支持我的搜索结果并正确排序,但是需要获得位置,因为我将创建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
答案 0 :(得分:1)
使用会话变量,可以确定行号。以下解决方案适用于所有版本的MySQL(尤其是 <8.0 )。
尝试以下查询:
@row_number
详细信息:
@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
。