MySql SELECT Запрос для нескольких ключевых слов в нескольких полях

Мне нужна помощь для логики SELECT вопрос и надеюсь, что кто-то может дать мне лучшую идею, чем тот, который у меня есть.

У меня есть такая таблица:

 +---------+----------+---------+-----------+
|      id | model    | variant | category  |
+---------+----------+---------+-----------+
|       1 | round    | black   | fruit     |
|       2 | square   | white   | vegetable |
|       3 | flat     | red     | meat      |
|       4 | round    | black   | meat      |
+---------+----------+---------+-----------+

Пользователям будет разрешено выполнить поиск по этой таблице, введя одно или несколько ключевых слов.

Запрос у меня сейчас делает MATCH по всем введенным ключевым словам AGAINST каждое поле и я получаю строки, которые соответствуют ЛЮБОМУ из ключевых слов.
Так что, если вход «круглое мясо», результатом будут строки 1, 3 и 4:

SELECT v.*, vt.color
FROM tbl_items
AS v
LEFT JOIN tbl_apple
AS vt
ON v.id = vt.v_id
WHERE (
MATCH (v.model) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE)
OR MATCH (v.variant) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE)
OR MATCH (v.category) AGAINST ('keyword1 keyword2 ' IN BOOLEAN MODE) )
AND v.type = 4

Однако мне нужно только вернуть строки, которые содержат ВСЕ ключевые слова. Ключевые слова могут содержаться в любом из трех столбцов.

Поэтому, если пользователь вводит «круглое мясо», возвращается только строка 4.

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

SELECT v.*, vt.color
FROM tbl_items
AS v
LEFT JOIN tbl_apple
AS vt
ON v.id = vt.v_id
WHERE
(
(v.model = 'keyword1'
OR v.variant = 'keyword1'
OR v.category = 'keyword1'
)
AND
(v.model = 'keyword2'
OR v.variant = 'keyword2'
OR v.category = 'keyword2'
)
)
AND v.type = 4

Есть ли лучший способ сделать это?

1

Решение

Это целый код, который может вам помочь. «Вы можете изменить запрос в соответствии с базой данных или требованиями.

    <?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'test');
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);

if(isset($_POST['submit']))
{
$search_text = $_POST['text'];

$values = explode(" ",$search_text);

$query = "";
foreach($values as $value)
{
$query .='concat(model,varient,category) like "%'.$value.'%" AND ';
}

$query .= "1=1";

$query = "select * from tbl_items where ".$query."";
$result= mysqli_query($db,$query);
echo '<table>';
while($row=mysqli_fetch_array($result))
{
echo '<tr>';
echo '<td>'.$row['model'].'</td><td>'.$row['varient'].'</td><td>'.$row['category'].'</td>';
echo '</tr>';
}
echo '</table>';
}
?>
<form method="post" name="form">
<input type="text" name="text" />
<input type="submit" value="submit" name="submit">
</form>
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector