Mysql 如何避免一对多关联中的重复记录而不使用distinct?
我有两个表Mysql 如何避免一对多关联中的重复记录而不使用distinct?,mysql,sql,postgresql,Mysql,Sql,Postgresql,我有两个表issues和time\u条目,它们之间有one-to-many关联。我们可以为一个问题创建多个time\u条目 下面是一些示例数据 问题 id | subject | description ------------------------------ 1 | test | test 2 | test1 | test1 3 | test2 | test2 时间条目 id | issue_id | hours | spent_
issues
和time\u条目
,它们之间有one-to-many
关联。我们可以为一个问题创建多个time\u条目
下面是一些示例数据
问题
id | subject | description
------------------------------
1 | test | test
2 | test1 | test1
3 | test2 | test2
时间条目
id | issue_id | hours | spent_on | created_on
---------------------------------------------------
1 | 1 | 2 | 2016-12-23 | 2016-12-23
2 | 1 | 2 | 2016-12-23 | 2016-12-23
3 | 2 | 3 | 2016-12-23 | 2016-12-23
4 | 2 | 5 | 2016-12-23 | 2016-12-23
5 | 4 | 4 | 2016-12-23 | 2016-12-23
现在,我想获取在特定日期之后花费时间的所有问题
SELECT *
FROM "issues"
INNER JOIN "time_entries" ON "time_entries"."issue_id" = "issues"."id"
WHERE time_entries.created_on > '2016-12-22'
它将返回具有多个条目的问题
的多条记录
id | subject | description
-----------------------------
1 | test | test
1 | test | test
2 | test1 | test1
2 | test1 | test1
3 | test2 | test2
如何在不使用distinct
的情况下避免这些重复记录。由于应用程序中的技术原因,我无法使用distinct
我们将非常感谢您的帮助 一个选项是使用选择DISTINCT
:
SELECT * FROM "issues"
INNER JOIN "time_entries" ON "time_entries"."issue_id" = "issues"."id"
WHERE time_entries.created_on > '2016-12-22'
group by id
SELECT DISTINCT t1.id,
t1.subject,
t1.description
FROM issues t1
INNER JOIN time_entries t2
ON t2.issue_id = t1.id
WHERE t2.created_on > '2016-12-22'
如果不能使用DISTINCT
或GROUP BY
,则另一个选项是使用子查询,该子查询汇总时间\u条目
表中的问题,并确定哪些问题符合要求。大概是这样的:
SELECT t1.id,
t1.subject,
t1.description
FROM issues t1
INNER JOIN
(
SELECT issue_id
FROM time_entries
GROUP BY issue_id
HAVING SUM(CASE WHEN created_on > '2016-12-22' THEN 1 ELSE 0 END) > 0
) t2
ON t2.issue_id = t1.id
一个选项是使用选择DISTINCT
:
SELECT DISTINCT t1.id,
t1.subject,
t1.description
FROM issues t1
INNER JOIN time_entries t2
ON t2.issue_id = t1.id
WHERE t2.created_on > '2016-12-22'
如果不能使用DISTINCT
或GROUP BY
,则另一个选项是使用子查询,该子查询汇总时间\u条目
表中的问题,并确定哪些问题符合要求。大概是这样的:
SELECT t1.id,
t1.subject,
t1.description
FROM issues t1
INNER JOIN
(
SELECT issue_id
FROM time_entries
GROUP BY issue_id
HAVING SUM(CASE WHEN created_on > '2016-12-22' THEN 1 ELSE 0 END) > 0
) t2
ON t2.issue_id = t1.id
您使用的是哪个数据库,MySQL还是Postgres?它们之间有很大的不同。你使用的是哪个数据库,MySQL还是Postgres?它们之间有很大的不同。由于我的应用程序中存在一些技术问题,我不能使用distinct
或group by
。@RamizRaja我给了你一个不需要这两个选项的选项。只是好奇,postgres是否有exists
?@Alex是的,postgres有一个exists
子句,q.v。这可能是另一种不使用GROUP BY
或DISTINCT
的方法。由于我的应用程序中存在一些技术问题,我无法使用DISTINCT
或GROUP BY
。@RamizRaja我给了你一个不需要这两个选项的选项。只是好奇,postgres是否有存在,Postgres有一个EXISTS
子句,q.v。这可能是另一种不使用GROUP BY
或DISTINCT
的方法。这只适用于某些版本的MySQL,即使这样也不理想,因为您不确定每个id
值将选择哪些记录。这只适用于某些版本的MySQL,即使这样,它也不理想,因为您不确定每个id
值将选择哪些记录。