MySQL PHP select 其中 "X,Y" 在 X、Y、Z 中
MySQL PHP select where "X,Y" is in X,Y,Z
如何完成下面的代码?我正在尝试 select news
从数据库和 locations
可以是 23,22,88,90
位置代码。我知道你可以只做 IN('23', '22', '88', '90')
但问题是,我的位置是一个字符串所以它像 IN('23,22,88,90')
我相信的那样出来。
如何展开位置字符串和 select 全部或任何包含字符串中位置的内容?所以在数据库中,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)");
希望我解释清楚了。
如果您的数据以逗号分隔存储在数据库列中,那么您可以按照以下示例使用 MYSQL FIND IN SET。
SELECT FIND_IN_SET('b','a,b,c,d');
或者您可以尝试在 MYSQL 中使用正则表达式,但它会太慢。
您可以创建一个位置数组,然后使用数组中的项目填充查询字符串
$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);
我在另一个网站上看到了回复 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 |
+--------+--------------+
除了 select 全部来自新闻 table 并让 PHP 过滤位置之外,您没有太多选择。不是一个非常有效的方法。
如何完成下面的代码?我正在尝试 select news
从数据库和 locations
可以是 23,22,88,90
位置代码。我知道你可以只做 IN('23', '22', '88', '90')
但问题是,我的位置是一个字符串所以它像 IN('23,22,88,90')
我相信的那样出来。
如何展开位置字符串和 select 全部或任何包含字符串中位置的内容?所以在数据库中,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)");
希望我解释清楚了。
如果您的数据以逗号分隔存储在数据库列中,那么您可以按照以下示例使用 MYSQL FIND IN SET。
SELECT FIND_IN_SET('b','a,b,c,d');
或者您可以尝试在 MYSQL 中使用正则表达式,但它会太慢。
您可以创建一个位置数组,然后使用数组中的项目填充查询字符串
$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);
我在另一个网站上看到了回复 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 |
+--------+--------------+
除了 select 全部来自新闻 table 并让 PHP 过滤位置之外,您没有太多选择。不是一个非常有效的方法。