Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 测试单个查询中的日期是否重叠_Php_Mysql - Fatal编程技术网

Php 测试单个查询中的日期是否重叠

Php 测试单个查询中的日期是否重叠,php,mysql,Php,Mysql,非常感谢您抽出时间来看看我的问题。我是mysql驱动的web应用程序的新手,在计算查询时遇到了一些麻烦 我有三张桌子: 活动: 表演者: 活动参与者: 检索我使用的事件数据 SELECT * FROM events JOIN event_performers ON events.event_id = event_performers.event_id 我想运行一个测试查询,以确定是否有任何执行者同时处理不同的事件 我试图检索所有执行者ID、所有事件ID,并通过它们中的每一个循环来比较日期,

非常感谢您抽出时间来看看我的问题。我是mysql驱动的web应用程序的新手,在计算查询时遇到了一些麻烦

我有三张桌子:

活动:

表演者:

活动参与者:

检索我使用的事件数据

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);
非常感谢您的帮助, Cheers

MySQL有一个子句,将您的查询呈现给:

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

希望这有助于

您可以使用类似

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)
以获取重叠事件的数量。 你只需要为一个特定的人增加你的限制

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中随心所欲地清理它,但这些数据可能是一个好的开始

你可能想这样或那样。寻找重叠,而不是包含。哇,老兄!我不知道你是怎么做到的,但似乎效果很好!,谢谢你;
SELECT * 
FROM events 
JOIN event_performers
ON events.event_id = event_performers.event_id 
WHERE start_time BETWEEN ? OR ? AND stop_time BETWEEN ? and ?
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)
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