仿¥ã®ãã°
âã¿ãããªãã¼ãã«ããã£ã¦ã
create table A ( id BIGINT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL DEFAULT '', PRIMARY KEY(id) ); create table B ( id BIGINT NOT NULL AUTO_INCREMENT, a_id BIGINT NOT NULL, name VARCHAR(20) NOT NULL DEFAULT '', FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE CASCADE, PRIMARY KEY(id) );
Aãã¼ãã«ã®ãã¼ã¿ä¸è¦§ãåå¾ããæ©è½ãä½ã£ã訳ã§ãããã®ä¸è¦§APIã§ã¯çµãè¾¼ã¿æ¡ä»¶ãæå®ã§ãã¦ã
- Aã®å±æ§ã§ã®çµãè¾¼ã¿
- Bã®å±æ§ã§ã®çµãè¾¼ã¿(æå®ããã屿§ãæã¤Bã¨é¢é£ã¥ããããAã®ã¿ãè¿ã)
- ããã³ãæ¡ä»¶ã®AND,ORã§ã®çµå
ããµãã¼ãããã
ããã§ãBã®å±æ§ã§ã®æ¤ç´¢ã以ä¸ã®ããã«è¡ãªã£ã¦ããã®ã ãã©ãããã§ã¯ãã¡ãªãã¨ã«ä»æ¥æ°ä»ããã»ã»ã»ãorz
select distinct -- éè¤è¡ãã¯ãã A.id, -- å¿ è¦ãªAã®å±æ§ãåæ A.name from A join B on B.a_id = A.id -- Aãã¼ãã«ã¨Bãã¼ãã«ãjoin where B.name = 'aa'; -- æ¤ç´¢æ¡ä»¶ã並ã¹ã
ãã¼ãã«ã«âã®ãããªãã¼ã¿ãå ¥ã£ã¦ããã¨ããã¨
mysql> select * from A; +----+------+ | id | name | +----+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | +----+------+ 3 rows in set (0.00 sec) mysql> select * from B; +----+------+------+ | id | a_id | name | +----+------+------+ | 1 | 1 | aa | | 2 | 2 | aa | | 3 | 2 | bb | +----+------+------+ 3 rows in set (0.00 sec)
ä¸è¦ãã¾ããã¨åãã¦ããããã«è¦ãããã©
mysql> select distinct A.id, A.name from A join B on B.a_id = A.id where B.name = 'aa'; +----+------+ | id | name | +----+------+ | 1 | aaa | | 2 | bbb | +----+------+ 2 rows in set (0.01 sec) mysql> select distinct A.id, A.name from A join B on B.a_id = A.id where B.name = 'bb'; +----+------+ | id | name | +----+------+ | 2 | bbb | +----+------+ 1 row in set (0.00 sec)
æ¤ç´¢æ¡ä»¶ã«Aã®å±æ§ã追å ããã¨æå¾ ã¨éãçµæã«ãªãã
mysql> select distinct A.id, A.name from A join B on B.a_id = A.id where A.name = 'ccc' OR B.name = 'bb'; +----+------+ | id | name | +----+------+ | 2 | bbb | +----+------+ 1 row in set (0.00 sec) # ãã? cccãå«ã¾ããããºãªãã ã!
ã¨ããã®ããAã¨Bãå é¨çµåãã¦ããã®ã§Bããåç §ããã¦ããªãAã®è¡ãJOINããçµæã«å«ã¾ãã¦ãªãããã§ããã試ãã«distinctã¨æ¤ç´¢æ¡ä»¶ãå¤ãã¦å é¨çµåã ãè¡ãªã£ãçµæã¯ä»¥ä¸ã®éãããããããçµãè¾¼ã¿ã¨éè¤è¡ã®æé¤ãããã®ã§å½ç¶'ccc'ã®è¡ã¯è¿ãããªãã
mysql> select * from A join B on B.a_id = A.id; +----+------+----+------+------+ | id | name | id | a_id | name | +----+------+----+------+------+ | 1 | aaa | 1 | 1 | aa | | 2 | bbb | 2 | 2 | aa | | 2 | bbb | 3 | 2 | bb | +----+------+----+------+------+ 3 rows in set (0.00 sec)
ã¾ããANDãORã§çµåããªãã¦ãAã®å±æ§ã§æ¤ç´¢ããã°ãããã¯ããªãã§ããããã®å ´åããããJOINãããªãå®è£ ã«ãã¦ããã®ã§æ°ä»ããªãã£ãã®ã§ãããã¼ãã¨ãããããAã¨Bã®å±æ§ãæ··ãã¦ã®æ¤ç´¢ã¯ä»åã¯ä½¿ããªã(=æ¥ãã§ç´ããªãã¦ããã)ã®ã§ãéçºå è©¦é¨æéã«ã§ãã¡ããã£ã¨ç´ããããªã
å¯¾çæ¡
# ãã®1 mysql> select distinct A.id, A.name from A left join B on B.a_id = A.id where A.name = 'ccc' or B.name = 'bb'; +----+------+ | id | name | +----+------+ | 2 | bbb | | 3 | ccc | +----+------+ 2 rows in set (0.00 sec) # ãã®2 mysql> select A.id, A.name from A where A.name = 'ccc' or exists ( select id from B where B.a_id = A.id and B.name = 'bb'); +----+------+ | id | name | +----+------+ | 2 | bbb | | 3 | ccc | +----+------+ 2 rows in set (0.00 sec)
ä¸è¬çã«ã¯ã©ããããã ããã