多重存在vs联盟

时间:2015-10-01 08:08:07

标签: mysql

如果我希望得到一个布尔值1,如果id在其中一个表中,那么0如果不是,那么最好/最快的方式是什么?

A: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种解决方案更好,请写下来。

描述:

A:

+------+-------------+-------+-------+---------------+---------+---------+-------+------+----------------+
| 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 |                |
+------+--------------+--------------+-------+---------------+---------+---------+-------+------+----------------+

1 个答案:

答案 0 :(得分:0)

也许D(未经测试):

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