SQL - 选择两列中具有相同值的行

时间:2014-05-25 22:18:23

标签: mysql sql join

该主题的解决方案正在回避我。

我有一张桌子(除了与我的问题无关的其他字段):

NAME,CARDNUMBER,MEMBERTYPE

现在,我想要一个显示cardnumber和membertype相同的行的视图。这两个字段都是整数。名称是VARCHAR。名称不是唯一的,并且重复的cardnumber,membertype也应显示相同的名称。

即。如果以下是表格:

JOHN       | 324   | 2
PETER      | 642   | 1
MARK       | 324   | 2
DIANNA     | 753   | 2
SPIDERMAN  | 642   | 1
JAMIE FOXX | 235   | 6

我想要:

JOHN       | 324   | 2
MARK       | 324   | 2
PETER      | 642   | 1
SPIDERMAN  | 642   | 1

这可以按卡号排序,以使其对人类有用。

最有效的方法是什么?

4 个答案:

答案 0 :(得分:7)

您可以使用exists

select * 
from yourtable y
where exists (
  select 1
  from yourtable y2 
  where y.name <> y2.name
    and y.cardnumber = y2.cardnumber
    and y.membertype = y2.membertype)

答案 1 :(得分:7)

  

最有效的方法是什么?

我相信JOIN会比EXISTS

更有效率
SELECT t1.* FROM myTable t1
JOIN (
    SELECT cardnumber, membertype
    FROM myTable
    GROUP BY cardnumber, membertype
    HAVING COUNT(*) > 1
) t2 ON t1.cardnumber = t2.cardnumber AND t1.membertype = t2.membertype

查询计划:http://www.sqlfiddle.com/#!2/0abe3/1

答案 2 :(得分:3)

由于您提到名称可以重复,并且重复的名称仍然意味着不同的人并且应该显示在结果集中,我们需要使用GROUP BY HAVING COUNT(*)&gt; 1为了真正发现欺骗。然后将其连接回主表以获取完整的结果列表。

此外,从您的评论中,听起来您将其包装到视图中,您需要将子查询分开。

CREATE VIEW DUP_CARDS
AS
SELECT CARDNUMBER, MEMBERTYPE
FROM mytable t2
GROUP BY CARDNUMBER, MEMBERTYPE
HAVING COUNT(*) > 1

CREATE VIEW DUP_ROWS
AS
SELECT t1.*
FROM mytable AS t1
INNER JOIN DUP_CARDS AS DUP
ON (T1.CARDNUMBER = DUP.CARDNUMBER AND T1.MEMBERTYPE = DUP.MEMBERTYPE )

SQL Fiddle Example

答案 3 :(得分:0)

如果您只需要了解3个非唯一字段的值对,则只需执行以下操作:

SELECT   concat(NAME, "|", CARDNUMBER, "|", MEMBERTYPE) AS myIdentifier, 
         COUNT(*) AS count
FROM     myTable 
GROUP BY myIdentifier
HAVING   count > 1

这将为您提供NAMECARDNUMBERMEMBERTYPE的所有不同对,这些计数不止一次地使用一次(计数重复多少次)。这不会给您返回条目,您必须在第二步中完成该操作。