Mysql UNION ALL 创建双记录
Mysql UNION ALL creates double records
我有以下表格:
平台:
-------------------------------------------------------
| id | team_id| name| url | logo
-------------------------------------------------------
job_platforms:
-------------------------------------------------------
| job_id | platform_id | startdate | enddate
-------------------------------------------------------
我想创建一个链接到特定工作的所有平台的列表,有和没有开始日期和结束日期
-------------------------------------------------------
| id | url| logo| startdate | enddate
-------------------------------------------------------
但我卡在了这一点上。创建开始日期 and/or 和结束日期后,可以在 job_platforms 中找到该平台。但是当当前作业没有选择平台时,平台不会保存在job_platforms中。只有开始日期为 and/or 结束日期的 platform_id 将存储在 job_platforms
中
起初我想存储所有平台,无论平台是否激活(startdate and/or enddate)。如果平台没有开始日期 and/or 和结束日期,则字段将为空。
但是当平台列表中添加新平台时,这将不起作用。
所以我在考虑使用 UNION,它让我接近我想去的地方,但还不安静 :)
这就是我目前拥有的:
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 的所有正确平台,但是当开始日期不为空时,记录出现两次。
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
子句中,它将外部连接转换为内部连接。
- 我引入了 table 别名,因此查询更易于编写和阅读。
- 我怀疑你真的需要
SELECT DISTINCT
。如果没有,请将其删除。它只会增加开销。
我有以下表格:
平台:
-------------------------------------------------------
| id | team_id| name| url | logo
-------------------------------------------------------
job_platforms:
-------------------------------------------------------
| job_id | platform_id | startdate | enddate
-------------------------------------------------------
我想创建一个链接到特定工作的所有平台的列表,有和没有开始日期和结束日期
-------------------------------------------------------
| id | url| logo| startdate | enddate
-------------------------------------------------------
但我卡在了这一点上。创建开始日期 and/or 和结束日期后,可以在 job_platforms 中找到该平台。但是当当前作业没有选择平台时,平台不会保存在job_platforms中。只有开始日期为 and/or 结束日期的 platform_id 将存储在 job_platforms
中起初我想存储所有平台,无论平台是否激活(startdate and/or enddate)。如果平台没有开始日期 and/or 和结束日期,则字段将为空。
但是当平台列表中添加新平台时,这将不起作用。 所以我在考虑使用 UNION,它让我接近我想去的地方,但还不安静 :)
这就是我目前拥有的:
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 的所有正确平台,但是当开始日期不为空时,记录出现两次。 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
子句中,它将外部连接转换为内部连接。 - 我引入了 table 别名,因此查询更易于编写和阅读。
- 我怀疑你真的需要
SELECT DISTINCT
。如果没有,请将其删除。它只会增加开销。