MySQL Union(或类似)查询

时间:2013-04-15 09:51:58

标签: mysql distinct union

我从MySQL的一对视图中获得了一些预订数据。它们完美匹配列,主要区别在于放置在其中一行中的预订代码。

背景如下:这是用于计算体育营的数字。人们被预订,但可以做额外的活动。

观点1:所有专家预约(比如:足球课)。

观点2:一般组。

由于旧的软件,预订过程导致许多人预订一般组,然后升级到旧班级。这在业务的其他方面也变得更加复杂。

要清楚 - 视图1实际上包含来自视图2中的一些人(但不仅仅是所有人)。这两个组的交集。显然,人们不能同时分成两组(只有一组!)。

查找View 2中的所有人当然很容易......就像查看1.但是,我需要生成基本上的报告:

  • “查看1”覆盖“查看2”......或换句话说:
  • “查看1”[种类] UNION“查看2”

但是:我不确定这样做的最好方法,因为会增加并发症:

每行大约(省略其他内容)如下:

User ID Timeslot Activity
1          A     Football
1          A     General
2          A     General
3          A     Football

如您所见,这些行都涉及时间段A:   - 用户2进行一般活动。   - 用户3做足球。   - 用户1做足球和一般。

由于这些项目不是唯一的,因此上面是UNION(不同的),因为没有真正不同的行。

我需要的输出如下:

User ID Timeslot Activity
1          A     Football
2          A     General
3          A     Football

在这里,足球比“普通”更“优先”,因此我可以随时了解人们的位置。

这个UNION在许多领域都有一个明确的条款,但忽略了其他领域。

所以:有没有人知道如何做到这一点:

  • “将两张桌子加在一起并覆盖其中一张,如果它们是相同的时间段”

或类似的东西:

  • “UNION DISTINCT上的选择性区别”。

干杯 瑞克

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT *
FROM
  (SELECT *,
          IF(Activity='General',1,0) AS order_column
   FROM `Table1`
   ORDER BY order_column) AS tmp
GROUP BY UserId

如果活动值为order_column,则会在原始表格中添加1作为值general;这样做我们可以选择此列的临时表排序(升序),所有其他记录都包含所有其他记录。之后,我们只需按用户ID选择此临时表分组的结果即可。没有任何聚合函数的clouse组取第一个匹配的记录。

编辑: 如果你不使用group by而不使用聚合函数,那么这是一个“丑陋”的选择:

SELECT UserId,
       Timeslot,
       SUBSTRING(MAX(CASE Activity WHEN "General" THEN "00General" WHEN "Football" THEN "01Football" ELSE Activity END) , 3)
FROM `Table1`
GROUP BY UserId,
         Timeslot LIMIT 0 ,
                        30

我们需要为Activity定义每个可能的值。