MySQL PHP выбирает, где "X, Y" находится в X, Y, Z

Как мне заполнить этот код ниже? Я пытаюсь получить select news из базы данных и locations, которые могут быть кодами местоположения 23,22,88,90. Я знаю, что вы можете просто сделать IN('23', '22', '88', '90'), но проблема в том, что мои местоположения представляют собой строку, поэтому я считаю, что это похоже на IN('23,22,88,90').

Как развернуть строку местоположений и выбрать все или любые, включая местоположения, в строке? Итак, в базе данных newsLocations может быть 222322,9023,80,9090. Если в этом есть смысл? поэтому, если у $locationstoGet есть только 22,88,90, он получит newsLocation, даже если результат будет просто 88,90 без 22.

$locationsToGet = '22,88';
$db->query("SELECT * FROM news WHERE newsLocation IN($locationstoGet)");

Надеюсь, я правильно это объяснил.

Почему бы тебе не нормализовать свои данные? Это значительно упрощает многие вещи

Nico Haase 04.07.2018 17:00

Лучший способ - нормализовать БД, как прокомментировал Нико. Другие способы, которые я могу придумать, - это использовать комбинацию WHERE, LIKE или использовать полнотекстовый поиск (MATCH, AGAINST), который требует полнотекстового индекса.

frz3993 04.07.2018 17:11

это даст больше информации, если вы добавите в вопрос структуру db.

prasanna puttaswamy 04.07.2018 17:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
318
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если ваши данные разделены запятыми и хранятся в столбце базы данных, вы можете использовать MYSQL FIND IN SET, как показано в примере ниже.

ВЫБРАТЬ FIND_IN_SET ('b', 'a, b, c, d');

ИЛИ вы можете попробовать с регулярным выражением в MYSQL, но это будет слишком медленно.

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

$locations = '22,88';
$locationsToGetArray = explode(",", $locationToGet)
$query = "SELECT * FROM news WHERE newsLocation IN(";
for ($i = 0; $i < count($locationsToGetArray); $i++) {
    $query .= $locationsToGetArray[$i];
    if ($i == (count($locationToGetArray) - 1)) $query.= ")";
    else $query .= ",";
 }
 $db->query($query);

Мне почему-то возвращается SELECT * FROM news WHERE newsLocation IN(0,1,

Jayden 04.07.2018 17:07

Попробуйте сейчас, я ошибся, я добавлял $ i вместо $ locationToGetArray [$ i], также, если инструкция немного отличается, вы должны поместить (count ($ locationToGetArray) -1) в круглые скобки

Dusan Radovanovic 04.07.2018 17:09
SELECT * FROM news WHERE newsLocation IN(22,88, с дополнительной запятой и отсутствующим )
Jayden 04.07.2018 17:12

Я не понимаю, он по-прежнему делает то же самое, что и раньше?

Jayden 04.07.2018 17:17

если инструкция немного отличается, вы должны поместить (count ($ locationToGetArray) -1) в круглые скобки

Dusan Radovanovic 04.07.2018 17:33
Ответ принят как подходящий

Увидел ответ на другом сайте здесь

Поэтому я адаптирую решение к вашему сценарию. Измените locationToGet на массив и используйте функцию implode, чтобы сгенерировать правильный синтаксис для предложения IN.

$locationsToGetArr = array('22','88');
$locations = "'".implode("','",$locationsToGetArr)."'"; //this should output '22','88'
$db->query("SELECT * FROM news WHERE newsLocation IN($locations)");

Это решение предполагает, что ваша структура базы данных такая же

+--------+--------------+
|  news  | newsLocation | 
+--------+--------------+
|   1    | 88           | 
|   1    | 22           |
|   2    | 22           |
|   2    | 88           |
+--------+--------------+

Но если вы храните свои данные следующим образом

    +--------+--------------+
    |  news  | newsLocation | 
    +--------+--------------+
    |   1    | 88,22        | 
    |   2    | 22,88        |
    +--------+--------------+

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

Но что, если newsLocations - это 88,22 из базы данных? Разве это не только выбор того, является ли newsLocations либо 88, либо 22?

Jayden 04.07.2018 17:20

Я предполагаю, что столбец newsLocation в новостях имеет одно значение (например, 88 или 22). Если вы храните как 88,22 в целом; тогда я думаю, вам следует подумать о нормализации вашей базы данных. В противном случае вам может потребоваться выбрать все из базы данных и отфильтровать данные из этого столбца на стороне приложения (например, PHP); что может быть дорого.

Mark Seah 04.07.2018 17:27

Чрезвычайно важно избегать данных каждый и все, используемых в запросе. В этом надуманном примере очевидно, что это безопасно, но при подключении к данным $_POST это создало бы огромный Отверстие для SQL-инъекции.

tadman 04.07.2018 18:04

Другие вопросы по теме