Mysql检查唯一数据

时间:2014-10-03 18:08:54

标签: mysql

我有一个包含三个数据列的表:

DATE          ID1    ID2
//
2012-10-01      5      9
2012-10-01      3      6
2012-10-01      1      7
2012-10-01      0      2
2012-10-01      8      4
//
2012-10-08      6      5
2012-10-08      5      8      >>> should FLAG!
//
2012-10-15      9      6
2012-10-15      3      4
2012-10-15      9      7      >>> should FLAG!
//

对于每个DATE分组,ID1和ID2中的ID应该是唯一的。

在我输入了一年的数据之后,我可以运行哪些查询来检查我是否还没有找到任何ID?

我可以通过每次输入日期来手动检查:

SELECT id FROM table a JOIN table b ON a.id = b.id
WHERE a.date = 2012-10-01 AND a.ID1 = b.ID1 ...

然而,对于一年的约会,这并不实际。

4 个答案:

答案 0 :(得分:1)

您可以使用此查询:

SELECT date, id1, id2 FROM data d 
WHERE EXISTS (
    SELECT * FROM data d2 
    WHERE d2.date = d.date AND ( 
        d2.id1 = d.id2 OR d2.id2 = d.id1 
        OR (d.id1=d2.id1 AND d.id2 <> d2.id2) 
        OR (d.id2=d2.id2 AND d.id1 <> d2.id1)
    )
)

这将选择id与同一日期的另一个id匹配的行,或者只选择其中一个id匹配(但不是两者)。

编辑:修正了@ a1ex07

注明的第二种情况

编辑2 :以下替代方案。

或者如果您愿意,这也是等效的:

SELECT d.date, d.id1, d.id2 FROM data d 
INNER JOIN (
    SELECT date, id FROM (
        SELECT date, id1 AS id FROM data
        UNION ALL
        SELECT date, id2 AS id FROM data
    ) AS tmp
    GROUP BY date, id HAVING COUNT(*) > 1
) AS dupes 
WHERE d.date = dupes.date AND (d.id1 = dupes.id OR d.id2 = dupes.id)

答案 1 :(得分:0)

您可以group by日期和count

SELECT   `date`, `id1`, COUNT (*)
FROM     `my_table`
GROUP BY `date`
HAVING   COUNT(*) > 1

重复id2的过程。

答案 2 :(得分:0)

在创建表时,对ID1和ID2设置唯一约束。

答案 3 :(得分:0)

这可能不是最简单的解决方案,但我认为它可以满足您的需求。基本上我创建了一个临时表(不是真正的临时表,只是一个表,如果你不需要它就可以删除),它将col1和col2中的id存储在一个字段中。然后将col1和col2值插入临时表并运行一个简单查询以提取任何具有计数&gt;的ID。 1.我将colName字段添加到临时表中,以防您需要跟踪值来自哪个id列。

CREATE TABLE temp (
    date DATE,
    id SMALLINT,
    colName VARCHAR(10)
);

INSERT INTO temp
    SELECT date, id1, 'id1'
    FROM table;

INSERT INTO temp
    SELECT date, id2, 'id2'
    FROM table;

SELECT date, id, COUNT(id) AS total
FROM temp
GROUP BY date, id
HAVING COUNT(id) > 1;

如果你经常运行它,你可以创建一个存储过程并以这种方式调用它。