【问题标题】:Is there a way to perform a MySQL query that accepts an array of values and only returns results of the first value found? [closed]有没有一种方法可以执行接受值数组并仅返回找到的第一个值的结果的 MySQL 查询? [关闭]
【发布时间】:2016-07-26 19:26:31
【问题描述】:

我试图弄清楚是否有一种方法可以运行单个查询,该查询接受要搜索的值数组并逐个进行直到找到结果。

基本上我想采用这种设置并将其放在一个查询中:

$arr_vals = [ array of values here ];

foreach( $arr_vals as $arr_val ){
    $results = mysql_query( SELECT * FROM my_db WHERE some_field = $arr_val );
    if( mysql_num_rows( $results ) ){
        return $results;
    }
}

因此,如果有任何方法可以不运行多个查询并仅返回当前值的结果。我宁愿不限制,也宁愿不使用 PHP 过滤结果,因为结果计数可能很高。

谢谢。

编辑!!!

我不想在这里只进行“单一”匹配。我想要第一个匹配值的结果,它可能是 1 行或 1000 行......稍后可以设置一个 LIMIT,但我不希望这成为答案的关键......显然这是一个简单的回答如果 LIMIT 是 1... 那么我就使用 IN()。

【问题讨论】:

  • WHERE field IN ()
  • 你试过什么?人们到底怎么还在使用mysql?顺便说一句,您不会将数组连接到字符串..
  • 我将添加查询...这不是我的实际代码,只是一个 sn-p...您应该明白我的意思
  • 不太确定.. 无论如何,如果您尝试传递一个 id 数组,请按照@u_mulder 的建议使用IN(),但显然在将它们连接为字符串之后。
  • 并且还要说明您想要搜索的顺序,因为您想获得第一个匹配项。

标签: php mysql


【解决方案1】:

因此,您有一个值数组用作条件,但每个值可能匹配许多行,并且您只想要匹配的第一个值的匹配项,但您想要所有匹配的行。所以 LIMIT 完全不会做你想做的事。

假设 PHP 变量 $values 是一个以逗号分隔的整数列表,因此这些值可以安全地插入(不会造成 SQL 注入漏洞):

SELECT t.*
FROM MyTable AS t
JOIN (
  SELECT someField
  FROM MyTable
  WHERE someField IN ($values)
  ORDER BY FIND_IN_SET(someField, '$values')
  LIMIT 1
) AS first ON (t.someField = first.someField);

如果值不是整数,则必须创建两个 PHP 变量,一个是每个值单独引用,另一个是单个字符串,不加引号。

演示:SQLFiddle

【讨论】:

  • 这很好,除了一个小细节......它会继续通过所有值和顺序,首先会找到。这可能是可行的。
  • 基本上如果您的数组是 1,2,3,4,5 并且 3,4,5 都是找到的结果,即使您的数组是 5,4,3,它也会始终为您提供 3 行,2,1。我的预期结果是始终返回在第二个数组中找到的第一个应该是 5。如果数组是 4、1、2、3、5,它应该返回 4。
  • 阅读 MySQL 的 FIND_IN_SET() 函数是如何工作的,并阅读 Maintaining order in MySQL “IN” query 的答案
  • ORDER BY FIELD() 是需要的,而不是 ORDER BY FIND_IN_SET()
  • 这两种功能都同样有效。
【解决方案2】:
$arr = [1,2,3,4,5]
$arr_str = implode (", ", $arr);

select * from my_db where unq_col = (SELECT unq_col FROM my_db WHERE some_field in ($arr_str) limit 1)

【讨论】:

  • 虽然代码通常不言自明,但最好在代码中添加一些解释。这会在审核队列中弹出,因为只有代码的答案往往如此。
【解决方案3】:

$query="SELECT * FROM table_name where some_field in ('".implode(',', $arr_vals)."')";

【讨论】:

  • 不,不符合要求。
  • 在 for 循环中找到第一个匹配项后使用 break 语句
  • 他想在一个查询中完成
  • 在查询中使用 case-when-then-else 语句
猜你喜欢
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多