Найдите перекрывающимися (дата/время) строки в одной таблице

Вам лучше создать новый список с пониманием списка и оставить только те кортежи со вторым элементом, которого нет в badWords:

[i for i in word_list if i[1] not in badWords]
# [(309, 'răzvan')]

14
задан ROMANIA_engineer 24 August 2017 в 21:00
поделиться

3 ответа

SELECT  m1.meetingID, m1.meetingStart, m1.meetingEnd, m2.meetingID
FROM    t_meeting m1, t_meeting m2
WHERE   (m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
        OR m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd)
        AND m1.meetingID <> m2.meetingID

Это выберет каждую пару дважды.

Если Вы хотите, чтобы каждая пара была выбрана только однажды, используйте:

SELECT  m1.meetingID, m1.meetingStart, m1.meetingEnd, m2.meetingID
FROM    t_meeting m1, t_meeting m2
WHERE   (m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
        OR m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd)
        AND m2.meetingID > m1.meetingID

Удостоверьтесь, что у Вас есть индексы на meetingStart и meetingEnd чтобы запрос работал эффективно.

MySQL, однако, будет, вероятно, использовать INDEX MERGE выполнять этот запрос, который не очень эффективен в текущей реализации.

Также можно попытаться использовать:

SELECT  m1.*, m2.*
FROM    (
        SELECT  m1.meetingID AS mid1, m2.meetingID AS mid2
        FROM    t_meeting m1, t_meeting m2
        WHERE   m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
                AND m2.meetingID <> m1.meetingID
        UNION
        SELECT  m1.meetingID, m2.meetingID
        FROM    t_meeting m1, t_meeting m2
        WHERE   m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd
                AND m2.meetingID <> m1.meetingID
        ) mo, t_meeting m1, t_meeting m2
WHERE   m1.meetingID = mid1
        AND m2.meetingID = mid2

, который более сложен, но будет по всей вероятности работать немного быстрее.

23
ответ дан 1 December 2019 в 12:13
поделиться

Вероятно, что-то вроде этого:

SELECT m1.meetingID, m2.meetingID
FROM meeting AS m1, meeting AS m2
WHERE m1.meetingID < m2.meetingID
    AND m1.meetingStart BETWEEN m2.meetingStart AND m2.meetingEnd
    OR m1.meetingEnd BETWEEN m2.meetingStart AND m2.meetingEnd

Путем выбора только m1.meetingID < m2.meetingID Вы не сравниваете строки с собой и не получаете дубликаты, потому что к каждой строке присоединились бы дважды (m1, m2) и (m2, m1)

0
ответ дан 1 December 2019 в 12:13
поделиться

Добавление и запуск встреч и время окончания к строкам результата:

SELECT m1.meetingID AS firstID, m1.meetingStart AS firstStart, 
m1.meetingEnd AS firstEnd, m2.meetingID AS secondID, 
m2.meetingStart AS secondStart, m2.meetingEnd AS secondEnd 
FROM meeting AS m1, meeting AS m2 
WHERE (m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd) 
AND (m1.meetingID != m2.meetingID)

Таким образом, m2 всегда будет тот, запускающийся одновременно или после m1, и m1.id! =m2.id гарантирует, что не будет содержать соответствия против себя.

Вы не должны проверять по встречающемуся концу, поскольку перекрытие может быть надежно обнаружено от просто сравнения встречи, запускаются.

0
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: