答案 0 :(得分:1)
我只想提出一个小建议:
在维护表中的关系时,如果使用Gii生成代码,那么将为您生成连接。然后,您可以轻松访问任何表格的任何列。
但我认为UNION
可能不是JOIN
的替代品。
答案 1 :(得分:1)
如果使用Gii为每个表创建模型类并选择在生成的模型中创建关系,则可以执行以下操作:
1)在您的国家/地区模型中,只需更改声明与机场关系的方法,如下所示:
public function getAirports() {
return $this->hasMany(Airports::className(), ['country_id' => 'id'])->with('airlines');
}
2)当你对这些国家进行查询时,你需要让相关的机场,航空公司和航班预订这样做:
$countries = Countries::find()
->where('something = something_else')
->with('airports')
->with('flightbooked')
->all();
通过这种方式,您可以使用比使用延迟加载更少的查询来填充所有相关模型。
答案 2 :(得分:0)
也许你可以使用 union all 。使用此运算符,您可以将多个查询的结果集连接在一起,从而保留每个查询的所有行。请注意,UNION运算符(没有ALL关键字)将消除结果集中存在的任何“重复”行。 UNION ALL运算符保留每个查询中的所有行(并且可能性能更好,因为它没有执行重复检查和删除操作的开销)。
每列的列数和数据类型必须在每个查询中匹配。如果其中一个查询的列数多于另一个查询,我们有时会在另一个查询中包含虚拟表达式,以使列和数据类型“匹配”。通常,在每个返回文字的查询的SELECT列表中包含一个表达式(一个额外的列)是有帮助的,以显示哪些查询是该行的“源”。
SELECT 'col1' AS source, col23, col343, col33, d FROM table1 WHERE ...
UNION ALL
SELECT 'col2', t2.fee, table2.fi, table2.fo, 'fum' FROM table2 JOIN table3 ON ...
UNION ALL
SELECT 'col3', '1', '2', buckle, my_shoe FROM table4
您可以在一组括号中包装这样的查询,并将其用作内联视图(或MySQL语言中的“派生表”),以便您可以对所有行执行聚合操作。 e.g:
select one.a
, SUM(one.b)
FROM (
SELECT 'q1' AS source, a, b, c, d FROM t1
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
) one
GROUP BY one.a
ORDER BY one.a
但我认为加入桌子更合适。希望能帮到你