有关如何针对数据库表检查数组的建议

时间:2013-03-05 09:10:45

标签: php mysql arrays

这就是我所拥有的:

  1. 1 数据库表,包含约2000条记录,已建立索引。 (重要的列是一个25个字符的字符串)。
  2. 数组,包含大约30个25个字符的字符串。
  3. 我想做什么:

    1. 我需要针对数据库表检查数组以查找任何字符串 匹配。
    2. 我需要能够识别数组中的哪些值只与表中的任何值匹配,如果有的话
    3. 我真的不想使用循环以单独的查询方式运行数组中的每个字符串,我认为必须有一种更有效的方法来执行此操作。

      任何想法都将不胜感激。我正在使用PHP 5.4.3和MySQL。

3 个答案:

答案 0 :(得分:3)

只需使用IN子句: -

SELECT somecolumn
FROM someTable
WHERE someCoumn IN ('a string', 'another string', 'etc')

在php中执行它可能(假设数组已经转义为SQL安全): -

$sql = "SELECT somecolumn
FROM someTable
WHERE someCoumn IN ('".implode("','", $someArray)."')";

如果你想要计算每个项目上的匹配数量(包括0的那些),那么这样的事情可能会更好: -

<?php

$result = $db->query("CREATE TEMPORARY TABLE CheckValues
(CheckValue varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`CheckValue`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;");

$result = $db->query("INSERT INTO CheckValues (CheckValue) VALUES('".implode("','", $someArray)."')");

$result = $db->query("SELECT CheckValue, COUNT(b.someCoumn) AS someCount
FROM CheckValues a
LEFT OUTER JOIN someTable b ON a.CheckValue = b.someCoumn
GROUP BY CheckValue");

while ($row = $result->fetch_assoc()) 
{
    echo "$row[CheckValue] - $row[someCount] <br />";
}

?>

答案 1 :(得分:2)

根据其他人的建议,您可以使用IN子句。以下是使用MySQLi代替mysql_*的示例,因此您无需担心转义和注入。

$criteria=array(/* string-to-search */);
$sql="SELECT * FROM `table` WHERE `column` IN (".implode(",",array_fill(0,count($criteria),"?")).")";
$stmt=$mysqli->prepare($sql);

call_user_func_array(array($stmt,"bind_param"),array_merge(array(str_repeat("s",count($criteria))),$criteria));

$stmt->execute();
$result=$stmt->get_result();

答案 2 :(得分:1)

您应该使用MYSQL WHERE IN子句。

使用如下:

SELECT * FROM TABLE_NAME WHERE COLUMN_NAME IN ('.implode(', ', $array).')'