0

我有一些来自 MySQL 中的一对视图的预订数据。它们完美匹配列,主要区别在于放置在这些行之一中的预订代码。

上下文如下:这是用于计算运动营的数字。人们已预订,但可以进行额外的活动。

查看 1:所有专业预订(例如:足球课)。

视图 2:一般组。

由于软件老旧,订票过程中很多人为普通团订票,然后升级到旧舱位。业务中其他地方的一些事情使这进一步复杂化。

需要明确的是 - 视图 1 实际上包含视图 2 中的一些(但不完全是全部)人员。这两个组有一个交集。显然,人们不能同时分成两组(只有一组!)。

查找视图 2 中的所有人当然很容易......视图 1 也是如此。但是,我需要生成一份报告,该报告基本上是:

  • “View 1”覆盖“View 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 上选择性不同”。

干杯瑞克

4

1 回答 1

0

尝试这个:

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

如果 Activity 值为;这将添加order_column到您的原始表中作为值 这样做,我们可以选择这个临时表按此列排序(升序),所有具有一般活动的记录都排在所有其他记录之后。之后,我们可以简单地按用户 id 选择这个临时表分组的结果。没有任何聚合函数的按 clouse 分组采用匹配的第一条记录。1general

编辑:如果你不使用 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

于 2013-04-15T10:46:05.713 回答