2016-09-26 35 views
1

我有一個事件表。主持人可以在一天內創建多個活動。一些事件是反覆發生的,有些則不是。我有一個複雜的(對我來說)SELECT語句,我認爲它需要條件語句以及可能的子查詢,我不知道如何處理它。MySQL在按條件分列多列時選擇行

選擇優先級:

  1. 如果主機有在同一天一個以上事件和 這些日期的一個不重複(0),則只能選擇非經常性事件主機在那個日期。
  2. 如果主持人在同一日期有多個事件,並且該日期的所有事件都會重複發生,請選擇該日期的該主持人的所有事件。
  3. 如果主機在給定日期只有一個事件,請選擇它,而不管它是否重複發生。

下面是一個示例事件表:

+----+--------+---------+------------+-----------+ 
| id | hostid | title | start_date | recurring | 
+----+--------+---------+------------+-----------+ 
| 1 |  1 | Event1A | 2016-10-01 |   1 | 
| 2 |  1 | Event1B | 2016-10-01 |   0 | 
| 3 |  1 | Event1C | 2016-10-02 |   0 | 
| 4 |  1 | Event1D | 2016-10-02 |   1 | 
| 5 |  1 | Event1E | 2016-10-02 |   1 | 
| 6 |  1 | Event1F | 2016-10-03 |   1 | 
| 7 |  1 | Event1G | 2016-10-03 |   1 | 
| 8 |  1 | Event1H | 2016-10-04 |   1 | 
| 9 |  1 | Event1I | 2016-10-05 |   0 | 
| 10 |  2 | Event2A | 2016-10-01 |   1 | 
| 11 |  2 | Event2B | 2016-10-01 |   0 | 
| 12 |  2 | Event2C | 2016-10-02 |   1 | 
| 13 |  2 | Event2D | 2016-10-03 |   0 | 
+----+--------+---------+------------+-----------+ 

這裏是我想要的結果:

+----+--------+---------+------------+-----------+ 
| id | hostid | title | start_date | recurring | 
+----+--------+---------+------------+-----------+ 
| 2 |  1 | Event1B | 2016-10-01 |   0 | 
| 3 |  1 | Event1C | 2016-10-02 |   0 | 
| 6 |  1 | Event1F | 2016-10-03 |   1 | 
| 7 |  1 | Event1G | 2016-10-03 |   1 | 
| 8 |  1 | Event1H | 2016-10-04 |   1 | 
| 9 |  1 | Event1I | 2016-10-05 |   0 | 
| 11 |  2 | Event2B | 2016-10-01 |   0 | 
| 12 |  2 | Event2C | 2016-10-02 |   1 | 
| 13 |  2 | Event2D | 2016-10-03 |   0 | 
+----+--------+---------+------------+-----------+ 

下面是表中的SQL小提琴鏈接:

http://sqlfiddle.com/#!9/6427e/6

回答

1

這個任務很簡單le:您希望每個主機和日期的記錄具有最小重複標誌。

select events.* 
from 
(
    select hostid, start_date, min(recurring) as recurring 
    from events 
    group by hostid, start_date 
) chosen 
join events on events.hostid = chosen.hostid 
      and events.start_date = chosen.start_date 
      and events.recurring = chosen.recurring 
order by events.id; 

這是你的SQL提琴回:http://sqlfiddle.com/#!9/6427e/59 :-)

+0

不錯!感謝您分享您的時間並幫助我。 – ctown4life

0

一個朋友幫我找到這個解決方案:

SELECT e.* 
FROM Events e 
LEFT JOIN (
    SELECT start_date, 
    hostid, 
    count(*) cnt, 
    AVG(Cast(recurring as decimal)) recur 
    FROM Events 
    GROUP BY start_date, hostid 
) r 
ON e.start_date = r.start_date 
AND e.hostid = r.hostid 
WHERE (e.recurring = 0 and r.recur <> 1) 
OR r.recur = 1 OR r.cnt = 1 
ORDER BY e.id 

http://sqlfiddle.com/#!9/6427e/65