0

3 つのテーブル A、B、C がある場合、各テーブルには、3 つのテーブル全体で一意である必要がある id 列があります。そのためにクエリを実行するにはどうすればよいですか? 現在、左結合を使用してカウントを見つけていますが、この特定の ID は 3 つのテーブルのうちの 1 つにしか存在しない可能性があるため、機能しません。

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 が 3 つのテーブル間で一意であるかどうかを確認しようとしています。

4

2 に答える 2

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
于 2013-06-10T05:25:07.007 に答える
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);

そして、あなたは得るでしょう

表 A
| | ID |
------
| | 1 |

表 B
| | ID |
------
| | 2 |

表 C
| | ID |
------
| | 3 |

これがSQLFiddleのデモです

于 2013-06-10T05:39:41.900 に答える