【发布时间】:2020-05-14 02:50:25
【问题描述】:
我有这样的表格和记录
我想显示重复的代码数据,其中位置是 a,我希望 foo 和 foo 2 显示,因为它们重复但 foo 2 不显示
我可以用这个查询显示所有重复的数据:
SELECT * FROM myTable
WHERE code
IN (SELECT * FROM (SELECT code
FROM myTable
GROUP BY code
HAVING COUNT(code) > 1)
AS a)
但是当添加到哪里
SELECT * FROM myTable
WHERE code
IN (SELECT * FROM (SELECT code
FROM myTable
GROUP BY code
HAVING COUNT(code) > 1)
AS a) AND place = 'a'
只显示 foo ,我也希望 foo 2 出现,因为它们都是重复的
--------更新-----------
用
固定SELECT *
FROM myTable m1
WHERE exists
(
SELECT code
FROM myTable m2
where m1.code = m2.code
and place = 'a'
)
但这并不能过滤重复数据,所以你需要结合WHERE IN
SELECT * FROM myTable
WHERE code
IN (SELECT * FROM (SELECT code
FROM myTable
GROUP BY code
HAVING COUNT(code) > 1)
AS a)
AND exists
(
SELECT code
FROM myTable m2
where m1.code = m2.code
and place = 'a'
)
但执行大数据仍然很慢,WHERE IN 可以更改为INNER JOIN
SELECT *
FROM myTable m1
INNER JOIN (
SELECT code
FROM myTable
GROUP BY code
HAVING COUNT( code ) > 1
) m2 ON m1.code=m2.code WHERE exists
(
SELECT code
FROM myTable m2
where m1.code = m2.code
and place = 'a'
)
为了更快,只需在INNER JOIN 之后添加WHERE 而不要使用WHERE IN 或WHERE EXISTS
SELECT *
FROM myTable m1
INNER JOIN (
SELECT code
FROM myTable
GROUP BY code
HAVING COUNT( code ) > 1
) m2 ON m1.code=m2.code
WHERE
(m1.place = "a" OR m2.place = "a")
但这会引发错误SELECT list is not in GROUP BY clause and contains nonaggregated column … incompatible with sql_mode=only_full_group_by 而这个solution 会解决这个问题
【问题讨论】: