mysql在不同表中的列中查找重复值

时间:2013-06-10 05:21:20

标签: mysql

给定3个表A,B和C,每个表都有一个id列,在三个表中必须是唯一的。我如何进行查询呢?现在我正在使用左连接并找到计数,但它不起作用,因为这个特定的id可能只存在于三个表中的一个

SELECT COUNT(*) as unique_id FROM A
        LEFT JOIN B on B.id= A.id
        LEFT JOIN Con B.id= C.id
 WHERE A.id='{$id}'
    OR B.id='{$id}'
    OR C.id='{$id}'

我试图找出这个$ id在这三个表中是否是唯一的。

2 个答案:

答案 0 :(得分:1)

由于MySQL没有FULL OUTER JOIN,你必须使用UNION。

SELECT COUNT(*) as unique_id
FROM (SELECT id FROM A WHERE id = '$id'
      UNION ALL
      SELECT id FROM B WHERE id = '$id'
      UNION ALL
      SELECT id FROM C WHERE id = '$id') x

答案 1 :(得分:1)

您可以执行以下操作

SELECT 
(
   (SELECT COUNT(*) FROM A WHERE id = 3)
 + (SELECT COUNT(*) FROM B WHERE id = 3)
 + (SELECT COUNT(*) FROM C WHERE id = 3)
) unique_count

这是 SQLFiddle 演示

现在而不是手动查找重复项并分配ID,您可能需要考虑通过使用单独的表格对auto_increment和简单触发器进行排序,使它们在表中独一无二。

您的数据库架构可能看起来像

CREATE TABLE id_seq (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE A (id INT NOT NULL);
CREATE TABLE B (id INT NOT NULL);
CREATE TABLE C (id INT NOT NULL);

触发器

DELIMITER $$
CREATE TRIGGER tg_a_insert
BEFORE INSERT ON a
FOR EACH ROW
BEGIN
  INSERT INTO id_seq VALUES (NULL);
  SET NEW.id = LAST_INSERT_ID();
END$$
DELIMITER ;

对于所有表格,它们都是相同的。只需更改触发器和表格的名称

即可

现在你可以INSERT到任何一个表,比如

INSERT INTO A (id) VALUES (0);
INSERT INTO B (id) VALUES (0);
INSERT INTO C (id) VALUES (0);

你会得到

Table A
| ID |
------
|  1 |

Table B
| ID |
------
|  2 |

Table C
| ID |
------
|  3 |

这是 SQLFiddle 演示