我有这样的表和记录
我要在WHERE位置显示重复的代码数据,我要显示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
出现,因为它们都是重复的
-------- UPDATE -----------
固定为
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'
)
要提高速度,只需在WHERE
之后添加INNER JOIN
,而不要使用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将解决此问题
答案 0 :(得分:2)
使用exists
尝试以下操作。这是demo。
SELECT *
FROM myTable m1
WHERE exists
(
SELECT code
FROM myTable m2
where m1.code = m2.code
and place = 'a'
)
输出:
| id | code | name | place |
| ---- | ------ | ----- | ----- |
| 1001 | 110004 | foo | a |
| 1002 | 110004 | foo 2 | b |
答案 1 :(得分:0)
您可以对以下查询执行的其他解决方法
SELECT tmp.*
FROM mytable tmp
INNER JOIN mytable tmp1 ON tmp1.Code = tmp.Code
And tmp1.id < tmp.Id
WHERE tmp1.place = 'a'