将两个不相关的SELECT-s与不同的ORDER-s组合成一个结果

时间:2015-11-11 12:35:16

标签: mysql sql

TL; DR:如何将不相关的表中的两个不同排序的 SELECT组合成一个结果?

我们说我有2张不相关的牌桌 - 游戏

表"猫":

+----+----------------+-----+
| id |      name      | age |
+----+----------------+-----+
|  1 | Balthazar      |   3 |
|  2 | Milkman        |   7 |
|  3 | The Dark Angel |   4 |
+----+----------------+-----+

表"游戏"

+----+----------+-------+
| id |   name   | plays |
+----+----------+-------+
|  1 | Snake    |    18 |
|  2 | Lemmings |   234 |
|  3 | Ludo     |    33 |
+----+----------+-------+

对于每个表格,我需要SELECT来订购它们,并获得不同的列:

SELECT age FROM `cats` ORDER BY age DESC;

SELECT plays FROM `games` ORDER BY plays DESC;

我希望得到两个结果使用一个查询,而不是两个。预期结果:

+-----+-------+
| age | plays |
+-----+-------+
|   7 |   234 |
|   4 |    33 |
|   3 |    18 |
+-----+-------+

JOIN没有意义,因为这些表没有任何关系。我在考虑使用UNION,但我无法弄清楚如何处理这两个查询的事实:

  1. 选择不同的列
  2. 按不同列排序结果
  3. 任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

一种方法是计算行号,然后加入该值:

select rn, max(age) as age, max(plays) as plays
from ((select c.age, NULL as plays, (@rnc := @rnc + 1) as rn
       from cats c cross join (select @rnc := 0) params
      ) union all
      (select NULL as age, g.plays, (@rng := @rng + 1) as rn
       from games g cross join (select @rng := 0) params
      )
     ) cg
group by rn;

答案 1 :(得分:0)

select age,plays from cats inner join games on cats.id=games.id