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

0

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

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

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

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

  • 4
    Почему вы не нормализуете свои данные? Это делает многие вещи намного проще
  • 0
    Лучший способ - нормализовать БД, как это прокомментировал Нико. Другие способы, которые я могу придумать, - использовать комбинацию WHERE, LIKE или полнотекстовый поиск (MATCH, AGAINST), для которых требуется полнотекстовый индекс.
Показать ещё 1 комментарий
Теги:
explode
implode

3 ответа

0
Лучший ответ

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

Поэтому я адаптирую решение там к вашему сценарию. Измените 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. Не очень эффективный метод.

  • 0
    Но что, если newsLocations - 88,22 из базы данных? Разве это не только выбрать, если newsLocations или 88 или 22 ?
  • 0
    Я предполагаю, что столбец newsLocation в новостях - это одно значение (т. Е. 88 или 22). Если вы храните как 88,22 в целом; тогда я думаю, что вы должны рассмотреть вопрос о нормализации вашей базы данных. В противном случае вам может потребоваться выбрать все из базы данных и отфильтровать данные из этого столбца на стороне приложения (например, PHP); который может быть дорогим.
Показать ещё 1 комментарий
0

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

SELECT FIND_IN_SET ('b', 'a, b, c, d');

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

0

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

$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);
  • 0
    Это возвращает SELECT * FROM news WHERE newsLocation IN(0,1, для меня по какой-то причине
  • 0
    Попробуйте сейчас, я допустил ошибку, я добавил $ i вместо $ locationToGetArray [$ i], также если оператор немного отличается, вы должны поместить (count ($ locationToGetArray) -1) в скобки
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню