根据连接过滤 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';
我使用 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';