我已经绊倒了一段时间了。我有一张名为 gears
的表其中包含名称为 id
的行, mid
, cid
和installed
。我想搜索此表并以 csv 格式返回 mid
的列表一些独特的cid
。例如如果 cid = $cid
我可以使用:
$query = $database -> query("SELECT COUNT(mid), GROUP_CONCAT(mid) FROM gears WHERE cid=$cid", __LINE__, __FILE__);
$gears_installed = $database -> get_result($query);
$gears = $database -> get_result($query, 0, 1);
不用担心函数名称,它们的作用完全符合人们的预期。因此,如果该特定 $cid
有 3 行,与 mid
号:bank
, lottery
和post
然后$gears_installed
等于 3 和 $gears
将等于 bank,lottery,post
。这按预期工作。
现在回答我的问题。每个独特mid
有自己的表,名为settings_mid_here
。即,对于上述三个,我有表 settings_bank
, settings_lottery
最后settings_post
。每个表还将有一个名为 cid
的列。 (这就是两者的联系方式)。如何运行一个查询以返回每个表中的整行,其中 cid=$cid
?我不想对 SELECT * FROM settings_bank WHERE cid=$cid
运行单独的查询和SELECT * FROM settings_post WHERE cid=$cid
最后SELECT * FROM settings_post WHERE cid=$cid
,因为这可能会导致一页加载时产生大约 10 个额外查询(目前有 10 个不同的 mid
)。
如您所见,问题是动态的。它必须能够适应不同数量的mid
s,以某种方式区分每个表中的设置(例如 settings_bank
可能有一个名称为 name
的列,因此可能有 settings_post
)。最后,如果不存在与给定 $cid
对应的行,它还必须能够返回默认行(非空值)。 .
这是一项复杂的任务,但我希望有人可以帮助我,因为我一无所获。
最佳答案
$queries = array();
foreach(explode(',', $gears) as $gear) {
$queries[] = "SELECT '$gear' AS gearname, settings_$gear.* FROM settings_$gear WHERE cid=$cid";
}
$sql = implode(' UNION ', $queries);
$query2 = $database->query($sql);
此查询将为每个表返回一行,并带有一个额外的 gearname
列来指示该行来自哪个表。
或者您可以动态创建 JOIN:
$gears_array = explode(',', $gears);
$joins = implode(' JOIN ', $gears_array);
$wheres = implode(' AND ',
array_map(function($g) use ($cid) {
return "$g.cid = $cid";
}, $gears_array));
$sql = "SELECT * FROM $joins WHERE $wheres";
$query2 = $database->query($sql);
关于php - 动态 MySQL 查询 : Join results from numerous tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19337828/