2015-10-01 37 views
3

如果我想要得到一个布尔值1,如果id在一个表中,如果不是0,最好/最快的方式是什么?多个存在vs联盟

答:2存在具有OR

SELECT 
    EXISTS(SELECT 1 FROM a WHERE id = 1) 
    OR EXISTS(SELECT 1 FROM b WHERE id = 1) 

B:1 UNION已存在

SELECT EXISTS(
    SELECT 1 FROM a WHERE id = 1 
    UNION 
    SELECT 1 FROM b WHERE id = 1) 

C:联盟与限制

SELECT 1 FROM a WHERE id = 1 
    UNION 
    SELECT 1 FROM b WHERE id = 1 
    UNION 
    SELECT 0 
    LIMIT 1 

如果你有一个更好的方式,然后我3解决方案,请写下来。

描述:

答:

+------+-------------+-------+-------+---------------+---------+---------+-------+------+----------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra   | 
+------+-------------+-------+-------+---------------+---------+---------+-------+------+----------------+ 
| 1 | PRIMARY  | NULL | NULL | NULL   | NULL | NULL | NULL | NULL | No tables used | 
| 3 | SUBQUERY | a  | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 2 | SUBQUERY | b  | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
+------+-------------+-------+-------+---------------+---------+---------+-------+------+----------------+ 

B:

+------+--------------+------------+-------+---------------+---------+---------+-------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra   | 
+------+--------------+------------+-------+---------------+---------+---------+-------+------+----------------+ 
| 1 | PRIMARY  | NULL  | NULL | NULL   | NULL | NULL | NULL | NULL | No tables used | 
| 2 | SUBQUERY  | a   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 3 | UNION  | b   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| NULL | UNION RESULT | <union2,3> | ALL | NULL   | NULL | NULL | NULL | NULL |    | 
+------+--------------+------------+-------+---------------+---------+---------+-------+------+----------------+ 

C:

+------+--------------+--------------+-------+---------------+---------+---------+-------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra   | 
+------+--------------+--------------+-------+---------------+---------+---------+-------+------+----------------+ 
| 1 | PRIMARY  | a   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 2 | UNION  | b   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 3 | UNION  | NULL   | NULL | NULL   | NULL | NULL | NULL | NULL | No tables used | 
| NULL | UNION RESULT | <union1,2,3> | ALL | NULL   | NULL | NULL | NULL | NULL |    | 
+------+--------------+--------------+-------+---------------+---------+---------+-------+------+----------------+ 

回答

0

也许d(未测试):

SELECT IFNULL((SELECT 1 FROM a,b WHERE a.id=1 OR b.id=1 LIMIT 1),0) 
+0

“使用连接缓冲区”听起来很贵 –