2014-05-05 37 views
3

非常感謝您抽出寶貴時間查看我的問題。我對mysql驅動的網絡應用程序很陌生,而且我正遇到一些麻煩,找出一個查詢。測試日期是否在單個查詢中重疊

我有3個表:

事件:

event_id(INT) | event_fee(INT) | start_time(DATE_TIME) | stop_time(DATE_TIME) 

表演者:

performer_id(INT) | performer_name(VARCHAR) | performer_fee(INT) 

event_performers:

event_performers_id(INT) | event_id(INT) | performer_id(INT) 

檢索我使用的事件數據。

SELECT * 
FROM events 
JOIN event_performers 
ON events.event_id = event_performers.event_id 

我想運行一個測試查詢來查明是否有任何執行者在同一時間在不同的事件上作用。

我試圖以檢索所有表演者的ID,所有事件的id和循環槽他們每個人來比較日期,但我得到了堆疊做foreach循環,並不能真正得到它的工作

include('app/config.php'); 

function return_all_performers(){ 
include(PATH . '/core/model/db_connect.php'); 

try { 
    $query_object = $db->query(" 
     SELECT performer_id 
     FROM performers 
     "); 
} catch (Exception $e){ 
    include_once(PATH . "/core/view/error.php"); 
    exit(); 
} 

return $query_object->fetchAll(PDO::FETCH_COLUMN, 0); 
} 

function return_all_performer_events($performer_id){ 
include(PATH . '/core/model/db_connect.php'); 

try { 
    $query_object = $db->prepare(" 
     SELECT * 
     FROM events 
     JOIN event_performers 
     ON events.event_id = event_performers.event_id 
     WHERE event_performers.performer_id = :performer_id 
     "); 
    $query_object->bindParam(':performer_id', $performer_id); 
    $query_object->execute(); 
} catch (Exception $e){ 
    include_once(PATH . "/core/view/error.php"); 
    exit(); 
} 

return $query_object->fetchAll(PDO::FETCH_ASSOC); 
} 

$performers_ids = return_all_performers(); 
$overlaps = array(); 

foreach ($performers_ids as $performer_id) { 
$performer_events = return_all_performer_events($performer_id); 

foreach ($performer_events as $event => $value) { 
    // Isolate Single event and compare it to others 
    // TO DO 
    // Check If times overlaps 
    /* 
    foreach() { 
     if(
      strtotime($event['start_time']) >= strtotime($isolated_event['start_time']) && 
      strtotime($event['start_time']) <= strtotime($isolated_event['stop_time']) 
     ){ 
      return true; 
     } 
     if(
      strtotime($event['stop_time']) >= strtotime($isolated_event['start_time']) && 
      strtotime($event['stop_time']) <= strtotime($isolated_event['stop_time']) 
     ){ 
      $overlaps[] = $event; 
     } 
    } 
    */ 
} 
} 

var_dump($overlaps); 

非常感謝你太多的幫助, 乾杯

回答

0
SELECT ep.performer_name, ep.performer_id, ep.performer_fee, e.event_id, e.event_fee, 
e.start_time, e.stop_time, group_concat(e2.event_id SEPARATOR ',') 
FROM events as e 
JOIN event_performers ep ON e.event_id = ep.event_id 
join events e2 on e2.event_id != e.event_id and 
    greatest(e2.start_time, e.start_time) < least(e2.stop_time,e.stop_time) 
join event_performers ep2 on ep2.event_id=e2.event_id and ep2.performer_id=ep.performer_id 
group by ep.performer_name, ep.performer_id, ep.performer_fee, e.event_id, e.event_fee, 
e.start_time, e.stop_time 

這將返回每個有衝突的事件,並列出與它衝突的每個事件。它可能導致有趣的數據,因爲如果A,B和C都發生衝突,你會得到3行。 1表示A與B和C發生衝突,另一種說法是B與A和C衝突,另一個說C與A和B衝突。也許你可以用PHP來「清理那個」,但是這個數據很可能一個好的開始。

+1

哇!我不知道你是如何工作的,但它似乎工作**完美!**,謝謝你! ;) –

0

MySQL有一個between條款,使您的查詢:

SELECT * 
FROM events 
JOIN event_performers 
ON events.event_id = event_performers.event_id 
WHERE start_time BETWEEN ? OR ? AND stop_time BETWEEN ? and ? 

何PE幫助...

+0

可能想'或者說。尋找重疊,不包含。 – SuperJer

+0

只是給OP一個樣本,但是,你的觀點是一個很好的觀點。 – hd1

0

您可以使用類似

SELECT 
    COUNT(*) AS amount_of_overlaps 
FROM 
    events_table AS e1 
JOIN (SELECT * FROM events_table) AS e2 ON (e2.id > e1.id) 
WHERE 
    (e2.start_date BETWEEN e1.start_date AND e1.end_date) 
OR 
    (e2.end_date BETWEEN e1.start_date AND e1.end_date) 

獲得重疊事件的數量。 你只需要爲特定的人添加你的限制。