如何在下面完成此代码?我正在尝试从数据库中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)");
我希望我能解释这个问题。
答案 0 :(得分:0)
如果您的数据以逗号分隔存储在databse列中,则可以按照以下示例使用MYSQL FIND IN SET。
SELECT FIND_IN_SET('b','a,b,c,d');
或者您可以尝试在MYSQL中使用正则表达式,但是速度太慢。
答案 1 :(得分: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);
答案 2 :(得分:0)
我在另一个网站here上看到了回复
因此,我将在那里解决方案适应您的情况。将locationsToGet更改为数组,然后使用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过滤位置之外,您别无选择。这不是一种非常有效的方法。