mysql union使用1个不同的条件进行选择

mysql union使用1个不同的条件进行选择,mysql,select,union,Mysql,Select,Union,我有一个巨大的选择,基本上3个选择粘在一起2工会。我的每个选择中的所有选择列都相同。其中唯一不同的是WHERE子句。它们都有几乎相同的where条件,每个条件中只有一个不同于其他条件。我的陈述是这样的 (SELECT column_name1, column_name2, column_name3, .... FROM users LEFT JOIN ... ON ... LEFT JOIN ... (bunch of LEFT JOINS) . . . WHERE (SAME COND

我有一个巨大的选择,基本上3个选择粘在一起2工会。我的每个选择中的所有选择列都相同。其中唯一不同的是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)
从这个选择中,我还想选择一些其他数据。我这样做是因为我希望有不同的用户顺序,但是他们的顺序总是从最高的程序到最低的程序。问题是我能不能缩短这个选择?因为除了一个条件外,几乎所有的东西都是一样的是没有意义的。当我在那里发现一个bug或者想要改变一些东西,因为这只是选择的一部分,我必须重写一切。
你能帮帮我吗?

你可以试试下面的方法。它先按程序id排序,然后按随机顺序排序。它利用用户定义的变量对行进行排序,每次到达一个新的程序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

你可以试试下面的方法。它先按程序id排序,然后按随机顺序排序。它利用用户定义的变量对行进行排序,每次到达一个新的程序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

+1.方法。我认为你应该在附加栏中加上一个*,因为这就是问题所要问的。方法+1。我认为你应该在附加栏中加上一个*,因为这就是问题所在。