我有以下表格:
平台:
-------------------------------------------------------
| id | team_id| name| url | logo
-------------------------------------------------------
作业平台:
-------------------------------------------------------
| job_id | platform_id | startdate | enddate
-------------------------------------------------------
我想创建一个所有平台的列表,这些平台链接到一个特定的作业,有或没有startdate和enddate
-------------------------------------------------------
| id | url| logo| startdate | enddate
-------------------------------------------------------
但我现在陷入了困境。当创建了startdate和/或enddate时,可以在job_platforms中找到平台。但是,如果尚未为当前作业选择平台,则不会将该平台保存在作业平台中。只有具有开始日期和/或结束日期的平台ID才会存储在作业平台中
一开始我想存储所有平台,不管平台是否激活(startdate和/或enddate)。如果平台没有startdate和/或enddate,则字段将为空。
但当新平台被添加到平台列表中时,这将不起作用。
所以我在考虑建立一个工会,它让我接近了我想要的位置,但还没有安静下来:)
这就是我现在所拥有的:
SELECT DISTINCT
platforms.id,
platforms.url,
platforms.logo,
platforms.no_platform_site,
job_platforms.startdate as startdate,
job_platforms.enddate as enddate,
platforms.team_id
FROM
platforms
LEFT JOIN job_platforms ON job_platforms.platform_id =
platforms.id
WHERE
platforms.team_id IN (1,2,3,4,5)
AND
job_platforms.job_id = 30
UNION ALL
SELECT DISTINCT
platforms.id,
platforms.url,
platforms.logo,
platforms.no_platform_site,
null as startdate,
null as enddate,
platforms.team_id
FROM
platforms
LEFT JOIN job_platforms ON job_platforms.platform_id =
platforms.id
WHERE
platforms.team_id IN (1,2,3,4,5)
这个查询的结果是,我得到了所有正确的平台,它们都链接到job_id 30,但是当startdate不是空的时候,记录会出现两次。
1次为空日期,1次为开始日期。
我上传了结果集的图片here
如何更改查询以便不显示双记录?
提前谢谢!
最佳答案
我想你只是想要一个left join
:
SELECT DISTINCT p.id, p.url, p.logo, ps.no_platform_site,
jp.startdate as startdate, jp.enddate as enddate,
p.team_id
FROM platforms p LEFT JOIN
job_platforms jp
ON jp.platform_id = p.id AND jp.job_id = 30
WHERE p.team_id IN (1, 2, 3, 4, 5);
笔记:
重要的是把
jp.job_id = 30
移到ON
子句中。在WHERE
子句中,它将外部联接转换为内部联接。我引入了表别名,因此查询更易于编写和读取。
我怀疑你真的需要
SELECT DISTINCT
。如果没有,请将其拆下。它只会增加开销。关于mysql - Mysql UNION ALL创建双记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54481912/