我有两个看起来像这样的表
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行的数据。
提前致谢
答案 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'];
}