У меня небольшая таблица SQL. Существует столбец "теги", в котором есть несколько слов, разделенных запятой. Используя PHP и MYSQLI, я хотел бы взять значение поиска и сравнить его отдельные слова с отдельными словами в теге SQL-тегов.
Это относительно небольшая база данных. Я могу придумать, как это сделать, когда я создаю отдельный столбец для каждого тега. Но я бы предпочел. Только если это единственный вариант.
Пример макета SQL, таблица: книги
"title" - "author" - "tags"
[Potter]-- [J.K.] -- [Wizards, WandsnShit,Magic]
[50 shades]-- [James] -- [Boobies, Sex]
[Ulysses]-- [Joyce] -- [WTF]
Пока мое направление было:
//obtains searchValue from HTML
$searchValue=$_GET["searchValue"];
//turns the values individual words into an array
$proxy = $searchValue;
$tags = explode(" ", $proxy);
//This is where I need help
SELECT * FROM books WHERE tags CONTAINS (cycle through 'tags' array)
Если все работает правильно, набрав " Гэндальф - волшебник ", следует вернуть книгу " Поттер ". Потому что " Мастер " - это тег книги " Поттер ".
И пока я нахожусь в нем. Может ли функция PHP "взорваться" изменить исходную строку или создать строку с копией?
Заранее спасибо.
Это плохой дизайн. Пусть поиск в сети для нормализации базы данных.
В вашей таблице книг должно быть уникальное поле id (первичный ключ, int, а не null, auto increment). После этого вам нужно создать таблицу отношений, в которой есть теги.
Например:
Книжный стол:
id
name
author
Таблица тегов
id
book_id
tag
После этого вы можете использовать:
$sql = "SELECT * FROM books"
. " INNER JOIN tags ON tags.book_id = books.id"
. " WHERE tags.tag = " . mysqli_real_escape_string($_GET["searchValue"]);
Или вы можете использовать ключевое слово LIKE
.
Заметка:
Мне всегда интересно, почему многие разработчики создают две переменные ни для чего?
$searchValue=$_GET["searchValue"];
//turns the values individual words into an array
$proxy = $searchValue;
$tags = explode(" ", $proxy);
вместо: $tags = explode(" ", $_GET["searchValue");