MySQL поисковый запрос с лайком - PullRequest
2 голосов
/ 13 июля 2011

У меня есть таблица базы данных с несколькими текстовыми полями, которые я использую для фильтрации данных, каждое из этих текстовых полей содержит числовые данные, разделенные двоеточием (например, «1: 2: 4: 5: 6: 7: 9»)

id   |  title         |  field1                 | filed2     | field3            |
1    | Some title1    |1:2:3:4:5:6:7            |1:2:3:6:7   | 1:2:4:5:7:9:10:11 | 
2    | Some title2    |1:2:3:4:5:6:7:8:9:10:11  |1:2:3:4:5:6 | 1:2:4:5:7:9:10:11 |
3    | Some title3    |1:2:3:4:5:6:7            |1:2:3:6:9   | 1:2:4:5:7:9:10:11 |
4    | Some title4    |3:4:5:6:7:10:11          |1:2:3:10:11 | 1:2:4:5:7:9:10:11 |
5    | Some title5    |1:2:3:4:5:6:7            |1:2:3:6:7   | 1:2:4:5:7:8:9:11  |
6    | Some title6    |2:3:4:5:6:7:9            |1:2:3:6:7   | 1:2:4:5:7:9       |

используя форму поиска, я использую флажки для каждого параметра для field1, field2 и field3 и использую php foreach для создания LIKE "% parameter%" для каждого поля

мой SQL-запрос выглядит SELECT * FROM table WHERE (field1 LIKE '%1%' OR field LIKE '%2%' ) AND (field2 LIKE '%1%' OR field2 LIKE '%2%')

к сожалению, этот запрос не дает мне хорошего результата, так как я получаю обратно строки, которые не соответствуют моей идее:)

например, если значения флажков выбраны пользователем 1,2,3,4,5,6,7 На запрос нужно вернуть только 1, 3 и 5 строку

Есть ли лучшее решение для фильтрации этих результатов

привет

Дополнительная информация:

Позвольте мне объяснить вам немного больше идеи.
Пользователь проверяет чекбоксы с некоторыми значениями (т. Е. 1,3,4,5,6,7). Скрипт должен возвращать только результаты, содержащие эти значения. в field1 то же самое происходит, когда пользователь устанавливает другие флажки, которые управляют field2 и field3, но пока это не важно

Дополнительная информация pt2.

Я постараюсь объяснить вам, чего я хочу достичь

У меня есть форма поиска с флажками и полями ввода радио, каждая группа флажков (значения от 1 до 10) представляют столбцы (field1, field2, field3) в таблице, каждое значение в столбцах field1, например, представляет выбранные флажки (которые являются установить в панели администратора для каждой строки) теперь по умолчанию все флажки установлены, и я получаю все результаты сейчас, когда пользователь снимает флажок с соответствующих флажков, результаты должны быть отфильтрованы со строками в соответствии с фильтром хороший пример того, чего я пытаюсь достичь, это http://www.hotelscombined.com/City/London.htm

, поэтому, если флажок со значением 2 снят, он не может быть указан в результатах

BR Сила

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Мне кажется, проблема в том, что %1% соответствует не только 1, но также 10, 11 и т. Д.

Лучше сделать что-то вроде этого:

WHERE CONCAT(':', field1, ':') LIKE '%:1:%'
0 голосов
/ 13 июля 2011

Используйте AND вместо OR:

SELECT * FROM table WHERE (field1 LIKE '%1%' AND field LIKE '%2%' ) AND (field2 LIKE '%1%' AND field2 LIKE '%2%')
0 голосов
/ 13 июля 2011

Как видите, field2 LIKE "% 1%" будет соответствовать полю со значением 2:10. Чтобы предотвратить это, добавьте двоеточие в конец и начало строки и найдите LIKE «%: 1:%». Другое возможное решение - добавление двоеточий в конец и начало в SQL CONCAT (':', field2, ':') LIKE '%: 1:%'

Другой способ - это рефакторинг вашей базы данных, например,

main_table
id   |title
1    |some title

link_table
main_id|field|value
1      |f1   |1     
1      |f1   |2     
1      |f2   |2     
1      |f3   |1     
1      |f3   |2    

и сделать запрос для получения данных

select id,title from main_table
join link_table on main_table.id=link_table.main_id
where (field = 'f1' and value in (1,2)) or (field = 'f2' and value in (2,3))

как результат, если вы используете свой текущий дизайн базы данных, если вам нужно получить все строки, которые имеют набор «1,2,3,4,5,6,7» в поле 1, вы будете нужно сделать запрос типа

WHERE CONCAT(':',field1,':') LIKE '%:1:%' OR  
CONCAT(':',field1,':') LIKE '%:2:%' OR 
CONCAT(':',field1,':') LIKE '%:3:%' OR
CONCAT(':',field1,':') LIKE '%:4:%' OR
CONCAT(':',field1,':') LIKE '%:5:%' OR
CONCAT(':',field1,':') LIKE '%:6:%' OR
CONCAT(':',field1,':') LIKE '%:7:%'

Если вы выполните рефакторинг, как я уже сказал, запрос будет выглядеть как

where field = 'f1' and value in (1,2,3,4,5,6,7)

и намного быстрее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...