如何从MySQL中选择行而不包括两列中的重复项

时间:2013-10-23 23:44:11

标签: mysql sql subquery union

如果有人可以在这里指出我先前存在的问题,那就太好了。结果我找不到这个案子。

查看SQL Fiddle以修补它。为了SO搜索能力,这里是模式和小提琴的问题:

在我的用户表中,我有一个独特的约束 用户被分配到的国家/地区(不超过一个用户) 每个国家)。但是,他们可以住在他们选择的任何地方。

开始问题

我只想返回指定国家/地区的用户 住所仅在记录中出现一次,在本案例中为记录4, 其中不希望跨列重复 并且行之间没有重复项。怎么样?! :)

CREATE TABLE users
    (`id` int, 
     `country` varchar(255), 
     `domicile` varchar(255), UNIQUE(country)
    )
;

INSERT INTO users
    (`id`, `country`, `domicile`)
VALUES
    # Duplicate across column and row
    (1, "usa", "usa"),
    (2, "canada", "usa"),

    # Duplicate only across columns or no duplication
    (3, "mexico", "mexico"),
    (4, "uganda", "australia"),    

    # Duplicate only across rows
    (5, "germany", "portugal"),
    (6, "france", "portugal"),
    (7, "spain", "portugal")
;

暂时搁置一边,正确的设计会让这更容易。我只是想用已经处理过的手来处理。 ;)

2 个答案:

答案 0 :(得分:2)

我认为这是最简单的方法:

SELECT *
FROM users
GROUP BY domicile
HAVING COUNT(*) = 1

FIDDLE

与Eugen的答案不同,这个答案取决于country列具有唯一约束的事实,因此它只需要检查domicile

答案 1 :(得分:1)

如果我理解正确,你想在国家和住所进行重复数据删除 - 所以我们需要两个步骤:

SELECT
  MIN(id),
  country,
  domicile,
  COUNT(*) AS domnum
FROM (
  SELECT
    MIN(id) AS id,
    country,
    domicile,
    COUNT(*) AS counum
  FROM users
  GROUP BY country
  HAVING counum=1
) AS base
GROUP BY domicile
HAVING domnum=1

修改

使用您的测试数据,跨越住所的重复数据删除就足够了,但无论如何我都包含了这两个步骤。

修改

SQLfiddle