Как мне заполнить этот код ниже? Я пытаюсь получить 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)");
Надеюсь, я правильно это объяснил.
Лучший способ - нормализовать БД, как прокомментировал Нико. Другие способы, которые я могу придумать, - это использовать комбинацию WHERE, LIKE или использовать полнотекстовый поиск (MATCH, AGAINST), который требует полнотекстового индекса.
это даст больше информации, если вы добавите в вопрос структуру db.






Если ваши данные разделены запятыми и хранятся в столбце базы данных, вы можете использовать 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,
Попробуйте сейчас, я ошибся, я добавлял $ i вместо $ locationToGetArray [$ i], также, если инструкция немного отличается, вы должны поместить (count ($ locationToGetArray) -1) в круглые скобки
SELECT * FROM news WHERE newsLocation IN(22,88, с дополнительной запятой и отсутствующим )Я не понимаю, он по-прежнему делает то же самое, что и раньше?
если инструкция немного отличается, вы должны поместить (count ($ locationToGetArray) -1) в круглые скобки
Увидел ответ на другом сайте здесь
Поэтому я адаптирую решение к вашему сценарию. Измените 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?
Я предполагаю, что столбец newsLocation в новостях имеет одно значение (например, 88 или 22). Если вы храните как 88,22 в целом; тогда я думаю, вам следует подумать о нормализации вашей базы данных. В противном случае вам может потребоваться выбрать все из базы данных и отфильтровать данные из этого столбца на стороне приложения (например, PHP); что может быть дорого.
Чрезвычайно важно избегать данных каждый и все, используемых в запросе. В этом надуманном примере очевидно, что это безопасно, но при подключении к данным $_POST это создало бы огромный Отверстие для SQL-инъекции.
Почему бы тебе не нормализовать свои данные? Это значительно упрощает многие вещи