Вы близко. Вам просто нужно переместить фильтрацию на второй таблице в условие on
:
select d.date, a.entry, a.exit
from DATES d left join
ATTENDANCE a
on d.date = a.when and a.name = 'Bob'
where MONTH(d.date) = MONTH('2019-01-01') and
YEAR(d.date) = YEAR('2019-01-01')
Примечания:
Лучший способ написать условие даты:
where d.date >= '2019-01-01' and
d.date < '2019-01-01' + interval 1 month
Это лучше, потому что оптимизатор может использовать индекс на date
, если он доступен.
Как другие предположили, если подобная реальному времени производительность не необходима, BeautifulSoup является хорошим решением:
import urllib2
from BeautifulSoup import BeautifulSoup
html = urllib2.urlopen("http://www.google.com").read()
soup = BeautifulSoup(html)
all_links = soup.findAll("a")
Что касается второго вопроса, да, ссылки HTML должны быть четко определены, но HTML, с которым Вы на самом деле встречаетесь, очень вряд ли будет стандартным. Красота BeautifulSoup состоит в том, что он использует подобную браузеру эвристику, чтобы попытаться проанализировать нестандартный, уродливый HTML, с которым Вы, вероятно, на самом деле столкнетесь.
Если Вы несомненно работаете над стандартным XHTML, можно использовать (намного) быстрее синтаксические анализаторы XML как эмигрант.
Regex, по причинам выше (синтаксический анализатор должен поддержать состояние и regex, не может сделать этого), никогда не будет общее решение.
Это зависит немного от того, как HTML производится. Если это несколько управляло Вами, может сойти с рук:
re.findall(r'''<link\s+.*?href=['"](.*?)['"].*?(?:</link|/)>''', html, re.I)
Нет нет.
Можно рассмотреть использование Красивого Супа. Можно назвать это стандартом для парсинга файлов HTML.
Shoudln't ссылка быть четко определенным regex?
Нет, [X] HTML не находится в общем случае, parseable с regex. Рассмотрите примеры как:
<link title='hello">world' href="x">link</link>
<!-- <link href="x">not a link</link> -->
<![CDATA[ ><link href="x">not a link</link> ]]>
<script>document.write('<link href="x">not a link</link>')</script>
и это - всего несколько случайных допустимых примеров; если необходимо справиться с реальным супом тега HTML, там миллион уродливых возможностей.
Если Вы знаете и можете полагаться на точный выходной формат целевой страницы, можно сойти с рук regex. Иначе это - полностью неправильный выбор для очистки веб-страниц.
Regexes с HTML становятся грязными. Просто используйте синтаксический анализатор DOM как Красивый Суп.
Shoudln't ссылка быть четко определенным regex? Это - довольно теоретический вопрос,
Я ответ второго PEZ:
Я не думаю, что HTML предоставляет себя "четко определенным" регулярным выражениям, так как это не регулярный язык.
Насколько я знаю, любой HTML-тэг может содержать любое количество вложенных тегов. Например:
<a href="http://stackoverflow.com">stackoverflow</a>
<a href="http://stackoverflow.com"><i>stackoverflow</i></a>
<a href="http://stackoverflow.com"><b><i>stackoverflow</i></b></a>
...
Таким образом, в принципе, для соответствия тегу правильно необходимо смочь, по крайней мере, к строкам совпадения формы:
BE
BBEE
BBBEEE
...
BBBBBBBBBBEEEEEEEEEE
...
где B означает начало тега, и E означает конец. Таким образом, необходимо смочь к строкам совпадения, сформированным любым числом B, сопровождаемого тем же числом E. Чтобы сделать это, Ваш matcher должен смочь "рассчитать", и регулярные выражения (т.е. конечные автоматы) просто не могут сделать этого (для подсчета, автомату нужен, по крайней мере, стек). Что касается ответа PEZ, HTML является контекстно-свободной грамматикой, не регулярным языком.
Ответ на два дополнительных вопроса там.
В ответ на вопрос № 2 (не был должен ссылка быть четко определенным регулярным выражением) ответ... нет.
Структура ссылки HTML является рекурсивным во многом как parens и фигурные скобки на языках программирования. Должно быть равное количество запуска и конструкций конца, и выражение "ссылки" может быть вложено в себе.
Для надлежащего соответствия выражению "ссылки", regex потребовался бы, чтобы считать запуск и конечные тэги. Регулярные выражения являются классом Конечных автоматов. По определению Конечные автоматы не могут "считать" конструкции в шаблоне. Грамматика требуется, чтобы описывать рекурсивную структуру данных, такую как это. Неспособность для regex для "рассчитывания" состоит в том, почему Вы видите языки программирования, описанные с Грамматиками в противоположность регулярным выражениям.
Таким образом, не возможно создать regex, который будет положительно соответствовать 100% всех выражений "ссылки". Существует, конечно, regex's, который будет соответствовать большому количеству "ссылки" с высокой степенью точности, но они никогда не будут прекрасны.
Я написал статью блога об этой проблеме недавно. Ограничения Регулярного выражения