[英]Query find value in comma seperated list 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點了此位置時,它沒有顯示。但是,關鍵是要從逗號分隔的列表中獲取多個值。
那么該怎么做呢?
您應該避免將多個值放在單個列中。
相反,建議創建另一個表locations(location_id, col1, col2, restaurant_id)
,而restaurant_id
字段引用表restaurant
的主鍵。
如果要從數據庫中提取逗號分隔的列表,則可以使用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
只是通過刪除餐廳名稱前后的空白來清理所有內容。
最好的解決方案是創建一個關系表,以實現餐廳和位置之間的多對多關系。 然后,您可以使用解決方案,例如如何在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
。
您可以使用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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.