我从MySQL的一对视图中获得了一些预订数据。它们完美匹配列,主要区别在于放置在其中一行中的预订代码。
背景如下:这是用于计算体育营的数字。人们被预订,但可以做额外的活动。
观点1:所有专家预约(比如:足球课)。
观点2:一般组。
由于旧的软件,预订过程导致许多人预订一般组,然后升级到旧班级。这在业务的其他方面也变得更加复杂。
要清楚 - 视图1实际上包含来自视图2中的一些人(但不仅仅是所有人)。这两个组的交集。显然,人们不能同时分成两组(只有一组!)。
查找View 2中的所有人当然很容易......就像查看1.但是,我需要生成基本上的报告:
但是:我不确定这样做的最好方法,因为会增加并发症:
每行大约(省略其他内容)如下:
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在许多领域都有一个明确的条款,但忽略了其他领域。
所以:有没有人知道如何做到这一点:
或类似的东西:
干杯 瑞克
答案 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
定义每个可能的值。