Я немного новичок в mysql, и у меня возникла проблема с тем, как мне лучше всего написать следующий запрос. Скажем, у меня есть таблица, в которой есть столбец datetime
а также несколько других, по которым я хочу выполнить поиск. Так как это всего лишь одна таблица, я не думаю, что здесь уместно использовать оператор соединения (но я могу ошибаться, поскольку я не так много сделал в отношении операторов соединения), и я думаю, что здесь мне нужен подзапрос. Поэтому мой первоначальный запрос заключается в поиске в таблице на основе строки поиска, введенной пользователем, а затем я хочу ограничить ее датой-временем (датой начала и датой окончания), также указанной пользователем в форме HTML.
Схема таблицы
id, datetime, host, level, message
Я хочу сначала выбрать все строки, содержащие $ searchstring, что-то вроде...
SELECT * FROM $table WHERE (level LIKE '%$searchstring%') OR (message LIKE '%$searchstring%') LIMIT $offset,$limit
Если я хочу ограничить приведенные выше результаты также столбцом datetime
, запрос будет выглядеть примерно так...
SELECT * FROM $table WHERE (datetime >='$startdate') AND (datetime < '$enddate')
Как я могу наилучшим образом объединить эти запросы в один, чтобы я мог сначала получить любые строки, которые соответствуют поисковому запросу, а затем еще больше ограничить строки начальным и конечным временем и датой?
ТИА
Вы можете достичь этого, используя единственное условие where. В твоем случае:
SELECT * FROM $table WHERE ((level LIKE '%$searchstring%') OR (message LIKE '%$searchstring%')) AND (datetime >='$startdate') AND (datetime < '$enddate') LIMIT $offset,$limit
Вы можете просто использовать UNION
:
SELECT *
FROM $table
WHERE (level LIKE '%$searchstring%')
OR (message LIKE '%$searchstring%')
LIMIT $offset,$limit
UNION
SELECT *
FROM $table
WHERE (datetime >='$startdate')
AND (datetime < '$enddate')
Mysql будет обрабатывать дублирующиеся строки для вас и в первую очередь выводит строки со строкой поиска. Если вам нужно установить ограничение для всего набора результатов или выполнить дополнительное упорядочение на основе ваших критериев, вы можете превратить его в подзапрос и выбрать/ограничить его.
Вам не нужно использовать JOIN
а только добавить условие
SELECT *
FROM $table
WHERE (level LIKE '%$searchstring%' OR message LIKE '%$searchstring%')
AND
datetime >='$startdate'
AND datetime < '$enddate'
LIMIT $offset,$limit