根据连接过滤 table 但 select 所有连接而不考虑过滤器

filter table based on join but select all joins without taking filter into account

我使用 Typeorm 查询生成器生成了以下查询

当前行为: 现在正在发生的事情是海军陆战队被正确过滤,但选定的加入也被给定条件过滤。只返回符合条件的码头,而不是所有属于海军陆战队的码头。

想要的结果: 我想获得至少有一个码头的所有海军陆战队,码头名称为 'dock 1'。我想包括属于该海军陆战队的所有码头,而不考虑他们的名字。

我应该如何执行这个查询?

如有任何帮助,我们将不胜感激。

mariadb 版本 15.1

typeorm@0.2.37

SELECT `c`.`id`                AS `c_id`,
       `c`.`name`              AS `c_name`,
       `c`.`description`       AS `c_description`,
       `c`.`FkId`              AS `c_FkId`,
       `c`.`FkModel`           AS `c_FkModel`,
       `c`.`isActive`          AS `c_isActive`,
       `c`.`createdAt`         AS `c_createdAt`,
       `c`.`updatedAt`         AS `c_updatedAt`,
       `c`.`phones`            AS `c_phones`,
       `c`.`emails`            AS `c_emails`,
       `c`.`mainImage`         AS `c_mainImage`,
       `c`.`galleryImages`     AS `c_galleryImages`,
       `c`.`addressDetailsId`  AS `c_addressDetailsId`,
       `c_Docks`.`id`          AS `c_Docks_id`,
       `c_Docks`.`name`        AS `c_Docks_name`,
       `c_Docks`.`description` AS `c_Docks_description`,
       `c_Docks`.`FkId`        AS `c_Docks_FkId`,
       `c_Docks`.`FkModel`     AS `c_Docks_FkModel`,
       `c_Docks`.`isActive`    AS `c_Docks_isActive`,
       `c_Docks`.`createdAt`   AS `c_Docks_createdAt`,
       `c_Docks`.`updatedAt`   AS `c_Docks_updatedAt`,
       `c_Docks`.`MarineId`    AS `c_Docks_MarineId`
FROM `marine` `c`
         LEFT JOIN `dock` `c_Docks` ON `c_Docks`.`MarineId` = `c`.`id`
WHERE `c`.`isActive` = true
  AND (`c_Docks`.`name` = 'dock 1')
# ORDER BY c_id DESC

您可以加​​入 dock 两次。一次过滤码头名称,另一次获取所有码头。

SELECT `c`.`id`                AS `c_id`,
       `c`.`name`              AS `c_name`,
       `c`.`description`       AS `c_description`,
       `c`.`FkId`              AS `c_FkId`,
       `c`.`FkModel`           AS `c_FkModel`,
       `c`.`isActive`          AS `c_isActive`,
       `c`.`createdAt`         AS `c_createdAt`,
       `c`.`updatedAt`         AS `c_updatedAt`,
       `c`.`phones`            AS `c_phones`,
       `c`.`emails`            AS `c_emails`,
       `c`.`mainImage`         AS `c_mainImage`,
       `c`.`galleryImages`     AS `c_galleryImages`,
       `c`.`addressDetailsId`  AS `c_addressDetailsId`,
       `c_Docks`.`id`          AS `c_Docks_id`,
       `c_Docks`.`name`        AS `c_Docks_name`,
       `c_Docks`.`description` AS `c_Docks_description`,
       `c_Docks`.`FkId`        AS `c_Docks_FkId`,
       `c_Docks`.`FkModel`     AS `c_Docks_FkModel`,
       `c_Docks`.`isActive`    AS `c_Docks_isActive`,
       `c_Docks`.`createdAt`   AS `c_Docks_createdAt`,
       `c_Docks`.`updatedAt`   AS `c_Docks_updatedAt`,
       `c_Docks`.`MarineId`    AS `c_Docks_MarineId`
FROM `marine` `c`
JOIN `dock` `c_Docks` ON `c_Docks`.`MarineId` = `c`.`id`
JOIN `dock` `dock_1` ON `dock_1`.`MarineId` = `c`.`id`
WHERE `c`.`isActive` = true
  AND `dock_1`.`name` = 'dock 1'

没有理由在这里使用 LEFT JOIN,因为您不想包括没有匹配 dock.

的海军陆战队员

第 1 步:从 table marine 中筛选出所有相关行: select 来自 marine C 其中 c.isActive = true
第 2 步:将较早的 SQL 设为内联视图,然后将其与 table 停靠栏连接,并在停靠栏 table 上应用过滤器。 所以,SQL 应该是这样的:

SELECT          c.<column_names> ,
                c_docks.<column_names>
FROM            (
                       SELECT <column_names>
                       FROM   marine
                       WHERE  isActive = true) c
LEFT OUTER JOIN dock c_docks
ON              c.id = c_docks.marine_id
AND             c_docks.NAME = 'dock 1';