MySQL在多行之间进行比较

时间:2010-05-19 19:37:38

标签: php mysql

我有一个包含以下列的MySQL表:id(int),date(timestamp),starttime(varchar),endtime(varchar),...

我需要找到两行或更多行占用的时隙。这是一个示例表

id|        date         |starttime|endtime |
__|_____________________|_________|________|
1 | 2010-02-16 17:37:36 |14:35:00 |17:37:00|
2 | 2010-02-17 12:24:22 |12:13:00 |14:32:00|
3 | 2010-02-16 12:24:22 |15:00:00 |18:00:00|

第1行和第3行发生碰撞,需要由用户更正。我需要一个查询来识别这样的碰撞行 - 这会给我一些碰撞中所有行的ID。

在数据库中插入数据时,我发现与此查询发生冲突:

SELECT ID FROM LEDGER 
WHERE
    DATE(DATE) = DATE('$timestamp')  
    AND (
        STR_TO_DATE('$starttime','%H:%i:%s') BETWEEN 
            STR_TO_DATE(STARTTIME,'%H:%i:%s') AND STR_TO_DATE(ENDTIME,'%H:%i:%s') OR
        STR_TO_DATE('$endtime','%H:%i:%s') BETWEEN 
            STR_TO_DATE(STARTTIME,'%H:%i:%s') AND STR_TO_DATE(ENDTIME,'%H:%i:%s') 
     ) AND
     FNAME = '$fname'";

有没有办法严格使用MySQL完成此操作,还是必须使用PHP来查找冲突?

编辑:Quassnoi的sollution帮助我创建了我需要的确切查询。就是这样:

SELECT  l1.id as id1, l2.id as id2, l1.lname as name1, l2.lname as name2, 
   l1.date as date1, l2.date as name2, l1.starttime as starttime1, 
   l2.starttime as starttime2, l1.endtime as endtime1, l2.endtime as endtime2
FROM    ledger l1
JOIN    ledger l2
ON      l2.starttime <= l1.endtime
    AND l2.endtime >= l1.starttime
    AND l2.lname = l1.lname
    AND l2.id != l1.id
    AND DATE(l2.date)=DATE(l1.date)

1 个答案:

答案 0 :(得分:2)

您可以发出此查询:

SELECT  l1.id, l2.id
FROM    ledger l1
JOIN    ledger l2
ON      ADDTIME(CAST(CAST(l2.date AS DATE) AS DATETIME), l2.starttime) <= ADDTIME(CAST(CAST(l1.date AS DATE) AS DATETIME), l1.endtime)
        AND ADDTIME(CAST(CAST(l2.date AS DATE) AS DATETIME), l2.endtime) <= ADDTIME(CAST(CAST(l1.date AS DATE) AS DATETIME), l1.starttime)
        AND l1.id < l2.id