【问题标题】:MySQL PHP select where "X,Y" is in X,Y,ZMySQL PHP选择“X,Y”在X,Y,Z中的位置
【发布时间】:2018-12-13 01:15:06
【问题描述】:

如何完成下面的代码?我正在尝试从数据库中获取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,即使结果只是88,90 而没有22,它也会得到newsLocation

$locationsToGet = '22,88';
$db->query("SELECT * FROM news WHERE newsLocation IN($locationstoGet)");

我希望我解释清楚了。

【问题讨论】:

  • 你为什么不规范化你的数据?这让很多事情变得更容易
  • 最好的方法是像 nico 评论的那样标准化数据库。我能想到的其他方法是使用 WHERE ,LIKE 组合或使用需要全文索引的全文搜索(MATCH,AGAINST)。
  • 如果您在问题中添加数据库结构,它会提供更多洞察力。

标签: php mysql sql explode implode


【解决方案1】:

我在另一个网站上看到了回复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 过滤位置之外,您将没有太多选择。不是很有效的方法。

【讨论】:

  • 但是如果newsLocations 是来自数据库的88,22 呢?这不只是选择newsLocations88 还是22
  • 我假设新闻中的 newsLocation 列是单个值(即 88 或 22)。如果您将整体存储为 88,22;那么我认为你应该考虑规范化你的数据库。否则,您可能需要从数据库中选择所有数据并在应用程序端过滤该列中的数据(例如 PHP);这可能很昂贵。
  • 转义查询中使用的所有数据非常重要。在这个人为的例子中,很明显它是安全的,但它连接到$_POST 数据,这将创建一个巨大的SQL injection hole
【解决方案2】:

如果您的数据以逗号分隔存储在数据库列中,那么您可以按照以下示例使用 MYSQL FIND IN SET。

SELECT FIND_IN_SET('b','a,b,c,d');

或者你可以尝试在 MYSQL 中使用正则表达式,但它会太慢。

【讨论】:

    【解决方案3】:

    您可以创建一个位置数组,然后使用数组中的项目填充查询字符串

    $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);
    

    【讨论】:

    • 出于某种原因,这会为我返回 SELECT * FROM news WHERE newsLocation IN(0,1,
    • 现在试试,我犯了一个错误,我添加的是$i而不是$locationsToGetArray[$i],如果语句有点不同,你应该把(count($locationToGetArray) -1 ) 到括号中
    • SELECT * FROM news WHERE newsLocation IN(22,88, 有一个额外的逗号,缺少)
    • 不明白,还是和以前一样?
    • 如果语句有点不同,你应该把 (count($locationToGetArray) -1) 放在括号里
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2022-01-12
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多