ON 子句 Laravel ORM 中的子查询

Posted

技术标签:

【中文标题】ON 子句 Laravel ORM 中的子查询【英文标题】:Subquery in ON clause Laravel ORM 【发布时间】:2015-11-27 03:40:08 【问题描述】:

如何在 Laravel ORM 中创建此查询?

SELECT b1.* FROM `buildings` b1 INNER JOIN `buildings` b2 ON b2.`id` IN (SELECT `id` FROM `ingame_buildings`) WHERE b1.`level` > b2.`level`

我尝试在->join()做:

function()
    return implode(',',IngameBuilding::get());

但它不起作用。

【问题讨论】:

您的原始查询对我来说没有意义。您实际上是在尝试SELECT * FROM buildings where id IN ( SELECT id FROM ingame_buildings),并且在数据集中,您想比较level 列吗? @yangqi - 我有两个专栏。第一个 - buildings 包含游戏中可用的所有建筑模板 - 第二个 - ingame_buildings 我放置数据的地方,关于当前城市的已建建筑物。我想找到所有可用的升级 - 我在buildings 表中有这些数据,因为我有字段idbuilding_idlevel,其中building_idlevel 是唯一的。我只能在ingame_buildings 中拥有building_id,它引用buildings.id 字段。 感谢您的澄清,据我了解building_idbuildingsingame_buildings 表中都有,但它们代表不同的含义? 简单来说,我有建筑:市政厅。这栋楼有3层。所以我在buildings 中有接下来的 3 个字段:(id, building_id, level): (12, 1, 1), (34, 1, 2), (56, 1, 3) - 并且id 字段是主键 ofc。玩家建造建筑物的地方,简单来说有市政厅 1 级,ingame_buildings 有:(id, building_id, owner_id): (1, 12, 1) 但是当基地有 3 级时,我有(1, 56, 1) :) 好的,我知道了。 building_id 在两个不同的表中确实令人困惑。建筑物中的那个标识一个唯一的建筑物,但ingame_buildings 中的那个是标识buildings 中唯一行的外键。看下面的答案,后面我会添加雄辩的查询。 【参考方案1】:

这是获取建筑物中所有级别高于ingame_buildings中现有建筑物级别的记录的查询

SELECT * FROM buildings
JOIN (
      SELECT a.building_id, b.level 
      FROM ingame_buildings as a
      JOIN buildings as b ON a.building_id=b.id
     ) 
AS ingame_level ON ingame_level.building_id=buildings.id
WHERE buildings.level > ingame_level.level

【讨论】:

ingame_level.building_id=buildings.id 的情况下,您应该使用buildings.building_id 进行正确的工作,但是非常感谢您的mutch 兄弟! :)

以上是关于ON 子句 Laravel ORM 中的子查询的主要内容,如果未能解决你的问题,请参考以下文章

未找到列:Laravel 5 多对多关系查询中“on 子句”中的 1054 未知列“managers.id”

Laravel ORM 选择查询函数 load() on null

BIGQUERY:连接谓词中的表不受支持的子查询

Laravel 5.8,在 where 子句中带有 Count(*) 的棘手子查询

MySQL的子查询中FROM和EXISTS子句的使用教程

SELECT 子句中的子查询