Mysql подзапрос или что-то лучше

0

Я немного новичок в 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')

Как я могу наилучшим образом объединить эти запросы в один, чтобы я мог сначала получить любые строки, которые соответствуют поисковому запросу, а затем еще больше ограничить строки начальным и конечным временем и датой?

ТИА

Теги:

3 ответа

1

Вы можете достичь этого, используя единственное условие where. В твоем случае:

SELECT * FROM $table WHERE ((level LIKE '%$searchstring%') OR (message LIKE '%$searchstring%')) AND (datetime >='$startdate') AND (datetime < '$enddate') LIMIT $offset,$limit
  • 0
    Это то, что я искал. У меня сложилось впечатление, что мне нужно 2 запроса, но теперь, когда я это вижу, это имеет смысл. Спасибо!
0

Вы можете просто использовать 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 будет обрабатывать дублирующиеся строки для вас и в первую очередь выводит строки со строкой поиска. Если вам нужно установить ограничение для всего набора результатов или выполнить дополнительное упорядочение на основе ваших критериев, вы можете превратить его в подзапрос и выбрать/ограничить его.

0

Вам не нужно использовать JOIN а только добавить условие

SELECT * 
FROM $table 
WHERE (level LIKE '%$searchstring%' OR message LIKE '%$searchstring%')
AND
datetime >='$startdate'
AND datetime < '$enddate'
LIMIT $offset,$limit

Ещё вопросы

Сообщество Overcoder
Наверх
Меню