Поиск значений через запятую в базе данных с помощью запроса SELECT MYSQL - PullRequest
0 голосов
/ 22 февраля 2019

У меня проблема с получением результатов из базы данных.У меня есть столбец «Регионы», который в качестве значения содержит все регионы, которые пользователь выбрал через форму подписки на рассылку с запятыми, например, «Ближний Восток, Европа»

Я создаю фильтр, который должен получить всесписок пользователей, которые регистрируются для определенного или нескольких регионов.Пользователи могут выбрать несколько регионов.Из внешнего интерфейса я получаю все выбранные регионы в этом формате «Глобальный, Ближний Восток», которые мне нужно использовать в своем запросе SQL, чтобы найти всех пользователей, у которых Глобальный и Ближний Восток являются выбранным регионом.

Я пытался использовать FIND_IN_SET, но это не очень помогает.Попробовал ниже

 $trimmedRegions = rtrim($sortType,', ');

 $query = "SELECT * FROM health_alerts_subscribers
            WHERE FIND_IN_SET(Regions, $trimmedRegions)";

Есть идеи, как мне добиться нужного результата, пожалуйста?

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Точная функция не соответствует вашим требованиям, но вы можете использовать следующий код:

$trimmedRegions = rtrim($sortType,', ');
$trimmedRegionsCollection = explode(",", $trimmedRegions);
$trimmedRegionsRegex = implode("|", $trimmedRegionsCollection); // make string like Global|Middle East

$query = 'SELECT * from health_alerts_subscribers WHERE CONCAT(",", `Regions`, ",") REGEXP ",('.$trimmedRegionsRegex.'),"';

Надеюсь, это поможет вам.

0 голосов
/ 22 февраля 2019

Я могу предложить этот подход.

SELECT * FROM table
WHERE 
   region like("%Global%")
   and region like ("%Middle East%")

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

0 голосов
/ 22 февраля 2019

Я рекомендую то, что говорит пользователь 3783243.Я бы пошел с FIND_IN_SET.Вот пример.

SELECT {columns} FROM {table} WHERE FIND_IN_SET({item_to_search}, {comma-delimited column})

Лучшим способом было бы создать таблицу регионов и добавить свои регионы, а затем создать связанную таблицу с именем, regionRelated(пример), а затем добавьте идентификатор из региона и таблицу связей (от многих ко многим)

Table structure example

Table region
id,region
1, Middle East
2, Global

Table user
id,name
1, John
2, Jan

Table userRegion
userId,regionId
1,1
2,1

SELECT user.id,user.name,region.region from user
left join userRegion ON region.userId=user.id
left  join region
where region.region in('Middle East','Global');

В раскрывающемся списке просто выберите все регионы, и когда пользователь выберет те, которые ему нужны, выбудет хранить его в таблице userRegion с INSERT INTO userRegion (идентификатор пользователя, regionId) (1,2); и т. д.

0 голосов
/ 22 февраля 2019

Вам в значительной степени нужно отформатировать свой sql следующим образом:

SELECT
    *
FROM
    table
WHERE
    regions = 'Europe' or
    regions like 'Europe,%' or
    regions like '%,Europe' or
    regions like '%,Europe,%' or
    regions = 'Middle East' or
    regions like 'Middle East,%' or
    regions like '%,Middle East' or
    regions like '%,Middle East,%'

В PHP вам нужно будет циклически проходить по регионам, которые выбрал пользователь, и динамически создавать запрос, подобный этому.

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