PHP/MYSQL搜索查询返回错误:子查询返回超过1行

PHP/MYSQL搜索查询返回错误:子查询返回超过1行,php,mysql,search,Php,Mysql,Search,请告诉我,我是mysql的新手,我的问题是: 我有一个名为“cong”的表,其中有以下列SID、排序码、pin、姓名、州、lga、邮政编码、地址、分钟、分钟照片、秒、分钟电话、秒电话,其中包含所有集会 列state、lga包含表states和local_govt中的id “states”表具有以下列id、country\u id、name,“local\u govt”表具有以下列id、country\u id、state\u id、name 我想在“cong”表上进行搜索,该表应在“state”

请告诉我,我是mysql的新手,我的问题是:

我有一个名为“cong”的表,其中有以下列SID、排序码、pin、姓名、州、lga、邮政编码、地址、分钟、分钟照片、秒、分钟电话、秒电话,其中包含所有集会

列state、lga包含表states和local_govt中的id

“states”表具有以下列id、country\u id、name,“local\u govt”表具有以下列id、country\u id、state\u id、name

我想在“cong”表上进行搜索,该表应在“state”和“local_govt”表中搜索匹配项,以下是我编写的搜索功能:

      <?php
      function find_cong($term) {
      $query = "SELECT * FROM cong";
      $query .= " WHERE state rLIKE
      (SELECT id FROM states WHERE upper(name) rLIKE '{$term}')";
      $query .= " OR lga rLIKE
      (SELECT id FROM local_govt WHERE upper(name) rLIKE '{$term}')";
      $query .= " OR upper(name) rLIKE '{$term}'";
      $query .= " OR upper(address) rLIKE '{$term}'";
      $query .= " OR upper(sort_code) rLIKE '{$term}'";
      $query .= " OR upper(pin) rLIKE '{$term}'";
      $query .= " OR upper(zip) rLIKE '{$term}'";
      $query .= " OR upper(min) rLIKE '{$term}'";
      $query .= " OR upper(sec) rLIKE '{$term}'";
      $query .= " OR upper(min_phone) rLIKE '{$term}'";
      $query .= " OR upper(sec_phone) rLIKE '{$term}'";
      $result = mysql_query($query);
      confirm_query($result);
      return $result;
      }

      function confirm_query($query) {
          if (!$query) {
             die("Database query failed : " . mysql_error());
          }
      }

      ?>
现在的问题是,它搜索一些术语并得出准确的结果,但对于一些特定术语,如地方政府和州名称,它会弹出一个错误: 数据库查询失败:子查询返回超过1行

我需要你的帮助,因为我不知道如何编写比这更好的代码。
谢谢。

您在WHERE声明的州和地方政府部分有子请求。对于给定的$term值,可能存在一些行,这些查询将返回多行的结果集。因为您使用的是rLIKE,它希望根据一个值而不是多个值进行计算,所以整个查询将出错

相反,重构如下:

$query .= " WHERE state IN (SELECT id FROM states WHERE upper(name) rLIKE '{$term}')";
$query .= " OR lga IN (SELECT id FROM local_govt WHERE upper(name) rLIKE '{$term}')";
这将解释这种意外情况

请注意,所编写的查询不太可能非常有效。因为您正在扫描许多不同的列,所以最好不要在这里使用regex,因为优化器将无法利用索引。理想情况下,将其减小为常数,以便可以使用:

SELECT * FROM cong WHERE $term IN (upper(name), upper(address)...)
但考虑到你的要求,这可能是不可能的。如果是这种情况,我可能会查看您的程序设计,并尝试从应用程序端将查询拆分为最多一列的查找,例如:

SELECT * FROM cong WHERE $term rLIKE upper(NAME)
这里有一个错误:

$query .= " WHERE state rLIKE
      (SELECT id FROM states WHERE upper(name) rLIKE '{$term}')";
      $query .= " OR lga rLIKE
      (SELECT id FROM local_govt WHERE upper(name) rLIKE '{$term}')";
rlike是一个正则表达式,但最终归结为值的直接比较。您的子查询返回多行,因此以重写方式,您的查询更像:

WHERE state = a,b,c,...
 OR lga  = z,y,x,...

您正试图对多个值进行相等性测试,这会混淆数据库。相等性测试针对单个值,例如a=b,而不是a=b、c

您可以将生成的SQL添加到问题中吗?您的查询语句是什么样子的?错误消息说明了一切-您使用的子查询必须返回单个值/行,但子查询返回多行。e、 g.其中x=选择。。。是其中之一。@andrewsi它一直都在代码中,只是被隐藏了。@Arian-我明白了-谢谢你!非常感谢你的回复,但说实话,我真的不明白你说我应该怎么写。请确定我应该这样做:$query.=WHERE state=SELECT id FROM states WHERE uppername rLIKE'{$term}'$query.=或lga=从本地政府选择id,其中大写字母类似“{$term}”;不管你怎么重写,只要你的子查询只返回一行+值就行了。我试着按照你的指示去做,效果很好,非常感谢。您说过这样做效率不高,请告诉我一种更有效的方式来编写查询。请原谅我的无知。我试着按照你的指示去做,效果很好,非常感谢。您说过这样做效率不高,请告诉我一种更有效的方式来编写查询。请原谅我的无知。添加了一些重构建议。