Вам лучше создать новый список с пониманием списка и оставить только те кортежи со вторым элементом, которого нет в badWords
:
[i for i in word_list if i[1] not in badWords]
# [(309, 'răzvan')]
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
, который более сложен, но будет по всей вероятности работать немного быстрее.
Вероятно, что-то вроде этого:
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)
Добавление и запуск встреч и время окончания к строкам результата:
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 гарантирует, что не будет содержать соответствия против себя.
Вы не должны проверять по встречающемуся концу, поскольку перекрытие может быть надежно обнаружено от просто сравнения встречи, запускаются.