mysql поиск конца 's' должен возвращать то же самое без окончания 's' - PullRequest
0 голосов
/ 29 февраля 2012

Я хочу выполнить поиск с помощью MATCH в MySQL.

У меня есть 1 таблица, содержащая поля "name" и "category".поле «категория» содержит книги, книги, книги.

Что я хочу, когда я ищу «книгу» или «книги» в поле категории, это должно дать мне 3 строки.

Кто-нибудь может мне помочь с этим?

спасибо

Мне нужно уточнить этот вопрос, на самом деле у меня есть веб-сайт с полем поиска.когда пользователь вводит что-то на это, мой веб должен искать в поле категории.настоящая проблема в том, что иногда пользователь вводит «книгу», иногда «книги», иногда «машину», иногда «машины».эти слова "s" после слова вызывают у меня головную боль, я знаю, что пользователь действительно хочет найти все, что связано с книгой или автомобилем, так что я должен сделать, если я должен убрать каждую букву "s"?или есть какое-нибудь лучшее решение?

Ari

Ответы [ 4 ]

0 голосов
/ 29 февраля 2012

Поиск с помощью MATCH () требует полнотекстового индекса по категории столбцов, что может быть избыточным.

Если вы действительно хотите просто эти два случая, вы можете написать

select * from table where
category = 'book' or category = 'books'

с помощью Oddant'sответ, вы также можете получить такие результаты, как «probookcover» или что-то еще.

Если вы хотите, чтобы он был без учета регистра, у вас есть несколько вариантов.

select * from table where
lower(category) = 'book' or lower(category) = 'books'

или

select * from table where
category like 'book' or category like 'books'

В качестве альтернативы вы также можете сделать

select * from table where
category like 'book%'

, который вернет вам все столбцы, начинающиеся с книги, но вы также можете получить 'bookcover'.

РЕДАКТИРОВАТЬ: С учетом вашего комментария:

Как я уже сказал, match () излишне, поэтому я бы сделал это так:

select * from table where
category = whatYourUserEnters OR category = substring(whatYourUserEnters, 1, length(whatYourUserEnters) - 1)
0 голосов
/ 29 февраля 2012

обрежьте ввод пользователя до приемлемой длины и попробуйте этот запрос

  $userInput = substr($input, 0, 4);

  select * from table where category like "%$userInput%"
0 голосов
/ 29 февраля 2012

Например, если вы выполняете запрос из PHP, вы можете подготовить запрос там, а затем использовать простое регулярное выражение:

<?php

$term = 'book';

if(substr($term,-1) == 's') { //if term ends in an s
  $term = substr($term,0,-1); //the word without the s
}

//TODO: escape $term to prevent SQL injection

$query = "
  SELECT * FROM table
  WHERE category REGEXP '{$term}s?' // s? matches zero or one 's' character
";
0 голосов
/ 29 февраля 2012
select *
from table
where category LIKE '%book%'
...