mysql union选择1个不同的条件

时间:2013-08-04 21:09:36

标签: mysql select union

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

(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 个答案:

答案 0 :(得分:1)

您可以尝试以下方法。它首先通过program_id然后随机地对行进行排序。它利用用户定义的变量对行进行排名,每次达到新的program_id时从1开始。最后它只返回rank低于或等于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