php - 动态 MySQL 查询 : Join results from numerous tables

标签 php mysql sql join

我已经绊倒了一段时间了。我有一张名为 gears 的表其中包含名称为 id 的行, mid , cidinstalled 。我想搜索此表并以 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 , lotterypost然后$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/

相关文章:

mysql - 从外部删除mysql中的表

java - 为什么 Spring JPA 双向 OneToMany 和 ManyToOne 不更新外键列?

使用在另一个脚本中工作的凭据进行 php 访问错误

php - 检查 token 是否在 Laravel 中过期

php - 使用 jQuery 的下拉框中的未定义索引

MySQL 将 CHAR(32) 数据类型转换为 BINARY(16) 而不会丢失数据

mysql - 在Mysql中获取今天unix时间戳的记录

javascript - 如何格式化jquery数据表中的日期列

php - 如何在 Volusion API 中编写连接查询

mysql - 我应该在大型 EAV 表中使用时间戳还是单独的时间列?