2013-04-15 93 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