给定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在这三个表中是否是唯一的。
答案 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 演示