2014-07-13 111 views
0

在我的脚本中,“餐馆”可以有多个位置,所以我在餐馆表中创建了一个包含昏迷分离列表和位置的列。查询在逗号分隔列表中查找值mysql

现在我想做一个msql查询,检查id是否可以从这个列(逗号分隔列表),如果是的话,选择它。我想出了这个

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

它的工作......但我有一些餐馆,我添加位置16和17,(16,17)现在,当我做到这一点查询位置16它显示了餐厅,但当我点这个位置17它不...但它的重点是从逗号分隔列表中获得多个值。

那该怎么做?

+1

看看“LIKE” - 关键字。而且对于http://en.wikipedia.org/wiki/First_normal_form – EGOrecords

+3

如果你规范化你的模式,这将是最好的。用逗号分隔的列表做这件事很困难而且效率低下。制作餐厅位置的单独表格。 – Barmar

回答

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"; 

如果你想找到餐馆在的位置,而不是所有位置中的任何,改变ANDOR

0

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

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

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只是通过删除餐厅名称前后可能有的空白来清理所有内容。

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'