查询以逗号分隔列表mysql查找值

时间:2014-07-13 18:51:15

标签: php mysql mysqli

在我的脚本中,“餐馆”可以有多个位置,因此,我在餐厅餐桌上创建了一个列,其中包含一个带有位置的昏迷分隔列表。

现在我想创建一个msql查询来检查id是否可以是fount是这个列(逗号分隔列表),如果是,那么选择它。我想出了这个

SELECT restaurant_id,restaurant_name 
FROM restaurant WHERE ('.$locIdList.') IN (locationRes) 
ORDER BY restaurant_name ASC'

它确实有效...但是我有一些餐馆,我添加位置16和17所以(16,17)现在当我对位置16进行此查询时它显示了餐厅但是当我点这个位置17时它确实不是......但重点是从逗号分隔列表中获取多个值。

那怎么办呢?

4 个答案:

答案 0 :(得分:0)

您应避免在单个列中放置多个值。

相反,建议您创建另一个表locations(location_id, col1, col2, restaurant_id),而restaurant_id字段引用表restaurant中的主键。

答案 1 :(得分:0)

如果您从数据库中获取逗号分隔列表,则可以使用PHP分隔列表并创建每个项目的数组。

$result_of_sql = "restaurant 1, restaurant 2, restaurant 3, restaurant 4, restaurant 5, restaurant 6";

$restaurants = explode(',', $result_of_sql);

echo '<ul>';
foreach ($restaurants as $restaurant) {
  echo '<li>' . trim($restaurant) . '</li>';
}
echo '</ul>';

这里发生的事情首先是你拉出所有餐馆(以逗号分隔的列表)。然后使用explode删除逗号并创建一个数组。然后使用foreach循环来回显整个数组。 trim只是通过删除餐馆名称之前和之后的空格来清理所有内容。

答案 2 :(得分:0)

最好的解决方案是创建一个实现餐馆和地点之间多对多关系的关系表。然后,您可以使用How to return rows that have the same column values in MySql之类的解决方案查找所有位置的所有餐馆。

要在逗号分隔列表中搜索值,请使用FIND_IN_SET。但是这一次只能搜索一个值。如果您想查找位于所有位置的餐馆,您需要组合多个电话:

$locArray = explode(',', $locIdList);
$locQuery = implode(' AND ', array_map(function($loc) { return "FIND_IN_SET($loc, locationRes)"; }, $locArray));
$query = "SELECT restaurant_id,restaurant_name 
          FROM restaurant 
          WHERE $locQuery
          ORDER BY restaurant_name ASC";

如果您要查找位于任何位置的餐馆而非所有位置,请将AND更改为OR

答案 3 :(得分:0)

您可以使用PHP为每个逗号分隔的值生成查询。即,在逗号分隔的比较字符串上运行PHP循环,将其转换为单个项目,并通过LIKE运算符和IN()函数比较每个项目。

SELECT restaurant_id,restaurant_name 
FROM restaurant WHERE ('16') IN (locationRes) 
OR 
FROM restaurant WHERE ('17') IN (locationRes) 
ORDER BY restaurant_name ASC'