2013-04-15 37 views
0

我有一些预订数据从MySQL的一对视图。它们完美地匹配列,主要区别在于放置在这些行之一中的预订代码。MySQL联盟(或类似的)查询

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

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

查看2:一般群体。

由于旧的软件,预订过程导致许多人为普通组预订,然后升级到老班。业务中其他地方的某些事情使情况更加复杂。

要清楚 - 视图1实际上包含一些(但不是全部)视图2中的人员。这两个组有交集。很明显,人们不能一次进入两个小组(只有一个小组!)。

发现是谁在查看2所有的人当然是很容易的......因为是查看1。但是,我需要出示了一份报告,基本上是:

  • “视图1”改写“视图2 ” ......或者换句话说:
  • ‘视图1’[排序]联盟‘查看2’

不过:我不知道这样做的最好的办法,因为有增加的并发症:

每一行都是ap近因(省略其他的东西)如下:

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

正如你所看到的,这些行所有关心时隙答: - 用户2不一般的活动。 - 用户3做足球。 - 用户1做足球和一般。

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

我需要的输出如下:

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

在这里,足球采取“优先”在“一般”,因此我得到的,人们在任何时候的图片。

此UNION在许多字段上有明显的子句,但忽略其他字段。

所以说:没有人知道如何做什么金额为:

  • “添加两个表连接在一起,并覆盖它们中的一个,如果是相同的时隙”

或者类似的东西一:

  • ”在UNION DISTINCT上选择性不同“。

干杯 里克

回答

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;这样做,我们可以选择按此列排序的临时表格(升序),并且所有具有一般活动的记录都是在所有其他记录之后。之后,我们可以简单地通过用户标识选择这个临时表分组的结果。没有任何聚合函数的clouse组获取匹配的第一条记录。

编辑: 如果不通过使用组没有聚合函数,这是一个“丑陋”的选择:

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每个可能值。

+0

不幸的是,我被禁止使用'group by'而没有聚合函数:它实际上不是SQL中的预期行为。 看到我以前的问题: http://stackoverflow.com/questions/15966530/mysql-edge-case-use-of-group-by – elb98rm