如何在不使用任何函数或过程的情况下为每个用户运行此查询?

huangapple go评论97阅读模式
英文:

How can i run this query for each user without using any function or procedure?

问题

以下是翻译好的代码部分:

  1. 这是我的查询,用于返回特定用户=27的连胜记录:
  2. SELECT MAX(sum) AS streak
  3. FROM (
  4. SELECT
  5. game_date,
  6. IF(points > 0, @sum:=@sum+1, @sum:=0) AS sum
  7. FROM (
  8. SELECT
  9. game_date,
  10. (SELECT COUNT(*) FROM point WHERE user_id = 27 AND bet_id = b.id AND goals > 0) AS points
  11. FROM bet b
  12. WHERE game_date < NOW()
  13. ORDER BY game_date DESC
  14. ) t1, (SELECT @sum:=0) t2
  15. ) t;
  16. **我尝试的内容:** 在我的本地 MySQL 上成功运行,但在 live phpMyAdmin 上出现错误,指出 user_id where 子句中的未知列。
  17. SELECT DISTINCT user_id,(
  18. SELECT MAX(SUM) AS streak
  19. FROM (
  20. SELECT
  21. game_date,
  22. IF(points > 0, @sum:=@sum+1, @sum:=0) AS SUM
  23. FROM (
  24. SELECT
  25. game_date,
  26. (SELECT COUNT(*) FROM POINT WHERE user_id = p.user_id AND bet_id = b.id AND goals > 0) AS points
  27. FROM bet b
  28. WHERE game_date < NOW()
  29. ORDER BY game_date DESC
  30. ) t1, (SELECT @sum:=0) t2
  31. ) t) AS streak FROM POINT p;

请注意,代码部分已被翻译,其余文本未被翻译。

英文:

Here is my query which returns streaks for specific user=27:

  1. SELECT MAX(sum) AS streak
  2. FROM (
  3. SELECT
  4. game_date,
  5. IF(points &gt; 0, @sum:=@sum+1, @sum:=0) AS sum
  6. FROM (
  7. SELECT
  8. game_date,
  9. (SELECT COUNT(*) FROM point WHERE user_id = 27 AND bet_id = b.id AND goals &gt; 0) AS points
  10. FROM bet b
  11. WHERE game_date &lt; NOW()
  12. ORDER BY game_date DESC
  13. ) t1, (SELECT @sum:=0) t2
  14. ) t;

What i try: it runs successfully on my local MySQL but gives an error on live phpMyAdmin that user_id is an unknown column in the where clause.

  1. SELECT DISTINCT user_id,(
  2. SELECT MAX(SUM) AS streak
  3. FROM (
  4. SELECT
  5. game_date,
  6. IF(points &gt; 0, @sum:=@sum+1, @sum:=0) AS SUM
  7. FROM (
  8. SELECT
  9. game_date,
  10. (SELECT COUNT(*) FROM POINT WHERE user_id = p.user_id AND bet_id = b.id AND goals &gt; 0) AS points
  11. FROM bet b
  12. WHERE game_date &lt; NOW()
  13. ORDER BY game_date DESC
  14. ) t1, (SELECT @sum:=0) t2
  15. ) t) AS streak FROM POINT p;

答案1

得分: 1

以下是代码部分的翻译:

  1. SELECT user_id, MAX(SUM) AS streak
  2. FROM (
  3. SELECT b.game_date, u.user_id,
  4. IF(
  5. IFNULL(p.bet_id, 0) &gt; 0,
  6. IF(@prev_user = u.user_id, @sum := @sum + 1, @sum := 1),
  7. @sum := 0
  8. ) AS SUM,
  9. @prev_user := u.user_id
  10. FROM bet b
  11. CROSS JOIN (SELECT DISTINCT user_id FROM `POINT`) u
  12. LEFT JOIN `POINT` p ON b.id = p.bet_id AND u.user_id = p.user_id AND p.goals &gt; 0
  13. JOIN (SELECT @sum:=0, @prev_user:=0) vars
  14. WHERE b.game_date &lt; NOW()
  15. ORDER BY u.user_id ASC, b.game_date DESC
  16. ) t
  17. GROUP BY user_id;
  1. SELECT user_id, IFNULL(MAX(streak), 0)
  2. FROM (
  3. SELECT *, rn1 - rn2,
  4. IF (
  5. goals IS NOT NULL,
  6. ROW_NUMBER() OVER (PARTITION BY user_id, rn1 - rn2 ORDER BY game_date),
  7. NULL
  8. ) AS streak
  9. FROM (
  10. SELECT b.id AS bet_id, b.game_date, u.user_id, p.goals,
  11. ROW_NUMBER() OVER (ORDER BY u.user_id, game_date) rn1,
  12. ROW_NUMBER() OVER (PARTITION BY u.user_id, IF(p.bet_id IS NULL, 0, 1) ORDER BY game_date) rn2
  13. FROM bet b
  14. CROSS JOIN (SELECT DISTINCT user_id FROM `POINT`) u
  15. LEFT JOIN `POINT` p ON b.id = p.bet_id AND u.user_id = p.user_id AND p.goals &gt; 0
  16. WHERE b.game_date &lt; NOW()
  17. ) t1
  18. ) t2
  19. GROUP BY user_id;
英文:

Without any sample data to test against, I may be way off the mark but give this a try:

  1. SELECT user_id, MAX(SUM) AS streak
  2. FROM (
  3. SELECT b.game_date, u.user_id,
  4. IF(
  5. IFNULL(p.bet_id, 0) &gt; 0,
  6. IF(@prev_user = u.user_id, @sum := @sum + 1, @sum := 1),
  7. @sum := 0
  8. ) AS SUM,
  9. @prev_user := u.user_id
  10. FROM bet b
  11. CROSS JOIN (SELECT DISTINCT user_id FROM `POINT`) u
  12. LEFT JOIN `POINT` p ON b.id = p.bet_id AND u.user_id = p.user_id AND p.goals &gt; 0
  13. JOIN (SELECT @sum:=0, @prev_user:=0) vars
  14. WHERE b.game_date &lt; NOW()
  15. ORDER BY u.user_id ASC, b.game_date DESC
  16. ) t
  17. GROUP BY user_id;

This is a variation of the gaps-and-islands problem.This query takes a different ("modern") approach, using the ROW_NUMBER() window function -

  1. SELECT user_id, IFNULL(MAX(streak), 0)
  2. FROM (
  3. SELECT *, rn1 - rn2,
  4. IF (
  5. goals IS NOT NULL,
  6. ROW_NUMBER() OVER (PARTITION BY user_id, rn1 - rn2 ORDER BY game_date),
  7. NULL
  8. ) AS streak
  9. FROM (
  10. SELECT b.id AS bet_id, b.game_date, u.user_id, p.goals,
  11. ROW_NUMBER() OVER (ORDER BY u.user_id, game_date) rn1,
  12. ROW_NUMBER() OVER (PARTITION BY u.user_id, IF(p.bet_id IS NULL, 0, 1) ORDER BY game_date) rn2
  13. FROM bet b
  14. CROSS JOIN (SELECT DISTINCT user_id FROM `POINT`) u
  15. LEFT JOIN `POINT` p ON b.id = p.bet_id AND u.user_id = p.user_id AND p.goals &gt; 0
  16. WHERE b.game_date &lt; NOW()
  17. ) t1
  18. ) t2
  19. GROUP BY user_id;

huangapple
  • 本文由 发表于 2023年2月9日 03:10:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/75390630.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定