mysql 联合选择具有 1 个不同的条件

标签 mysql select union

我有一个巨大的选择,基本上是 3 个选择与 2 个 UNION 粘合在一起。在我的每个选择中,所有选择列都是相同的。它们中的每一个都不同的一件事是 WHERE 子句。它们都具有几乎相同的 where 条件(每个条件中只有一个条件与其他条件不同)。我的陈述是这样的

(SELECT column_name1, column_name2, column_name3, ....
FROM users
LEFT JOIN ...
    ON ...
LEFT JOIN ...
(bunch of LEFT JOINS)
.
.
.
WHERE (SAME CONDITIONS) AND program_id = 3 order by RAND() limit 100)
UNION
(SELECT column_name1, column_name2, column_name3, ....
FROM users
LEFT JOIN ...
    ON ...
LEFT JOIN ...
(bunch of LEFT JOINS)
.
.
.
WHERE (SAME CONDITIONS) AND program_id = 2 order by RAND() limit 100)
(SELECT column_name1, column_name2, column_name3, ....
FROM users
LEFT JOIN ...
    ON ...
LEFT JOIN ...
(bunch of LEFT JOINS)
.
.
.
WHERE (SAME CONDITIONS) AND program_id = 1 order by RAND() limit 100)

并且从这个选择中我还想选择一些其他数据。我这样做是因为我想要不同的用户顺序,但他们的顺序必须始终从最高程序到最低程序。问题是我能以某种方式缩短这个选择吗?因为除了 1 个条件之外几乎所有东西都相同是没有意义的。 当我发现其中的错误或想要更改某些内容时(因为这只是选择的一部分)我必须重写所有内容. 你能帮帮我吗?

最佳答案

您可以尝试以下操作。它首先按 program_id 对行进行排序,然后按随机排序。它利用用户定义的变量对行进行排名,每次到达新的 program_id 时都从 1 开始。最后,它只返回排名低于或等于 100 的行。

SELECT
  id,
  program_id


FROM(
  SELECT
    id,
    program_id,
    @rank := IF(@program = program_id, @rank + 1, 1) AS rank,
    @program := program_id


  FROM(
    SELECT
      id,
      program_id

    FROM users

    WHERE program_id IN(1, 2, 3)
      #AND [other conditions]

    ORDER BY
      program_id,
      RAND()
  ) AS Derived

  JOIN (SELECT @program := 0, @rank := 0) AS var
) AS Derived


WHERE rank <= 100

ORDER BY
  program_id,
  id DESC

http://sqlfiddle.com/#!2/92d7b/1

关于mysql 联合选择具有 1 个不同的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047589/

相关文章:

php - 如何防止表单在无结果返回后重置?

MySQL SELECT WHERE CASE

python - 结合 mypy Union 和嵌套的 TypedDict 导致 mypy 错误 : incompatible return value

sql - 尝试多个 SELECT 直到结果可用的方法?

php - 同一张表上的 SQL JOIN 返回重复结果

mysql - HAVING 是按行还是按组运行?

php - 使用 Doctrine 设置 "time"或 DateInterval

php - 使用 id 自动递增在数据库中插入值

c# - System.IndexOutOfRangeException 错误 SQL SELECT 查询无法读取从我的表中选择的数据

mysql - 从表中选择行加上与一个查询中所选行相关的行