Mysql搜索用半冒号分隔的字符串

时间:2014-07-10 06:21:50

标签: php mysql

我有两个看起来像这样的表

table A            table B
id | data          id  | features
---------          --------------
1  | blue          1A  | 1;2
2  | red           2B  | 1;2;3 
3  | yellow        3B  | 3;1
......             ......

我打算做什么是这样的,我查询一个表。循环遍历结果数组并使用分号分隔符分解数据。然后循环通过该新数组并查询它以获取数据(下面的注释代码未经测试)

$sql = "SELECT * FROM `tableB` WHERE `id`= '2B' LIMIT 1";

$query = $db->query($sql);

while ($row = mysql_fetch_array($query)) {

       $arr = explode(';', $row['features']); 

       for ($i = 0; $i < sizeof($arr); $i++)
       {
               $sql2 = "SELECT * FROM `tableA` WHERE `id`="'.$arr[$i].'"";
               $query2 = $db->query($sql2);
               while ($row2 = mysql_fetch_array($query2)) {
                     $r[] = $row2['data'];
              }
       }
}

print_r($r);

有没有办法可以在mysql中实现这一点,我将tableB中的列与tableA中的ID匹配?或者可能不使用嵌套循环?表现是关键。因为两个表都有超过25k行的数据。

提前致谢

2 个答案:

答案 0 :(得分:1)

您要找的是IN function

这将采用一系列id,并在单个查询中为您提供每个结果。

因此,在您应用它之后,您的代码应如下所示

while ($row = mysql_fetch_array($query)) {
    $new_query = str_replace(";", ",", $row['features']); 
    $sql2 = "SELECT * FROM `tableA` WHERE `id` IN ($new_query)";
    $query2 = $db->query($sql2);
    while ($row2 = mysql_fetch_array($query2)) {
        $r[] = $row2['data'];
    }
}

答案 1 :(得分:1)

查看此代码。减少了几个循环。

$sql = "SELECT * FROM `tableB` WHERE `id`= '2B' LIMIT 1";
$query = $db->query($sql);
$arr = explode(';', $row['features']); 

$str = implode(",", $arr);

$sql2 = "SELECT  * FROM `tableA WHERE id IN ({$str});";

$query2 = $db->query($sql2);
while ($row2 = mysql_fetch_array($query2)) {
    $r[] = $row2['data'];
}