MySQL:选择表的所有行取决于外键?

时间:2017-11-04 07:44:32

标签: mysql

我不知道什么是实际问题,但我的问题在下面给出::

我有一个像这样的MySQL表table_name

+----+--------+-------+
| id | name   | f_key |
+----+--------+--------
| 1  | abcd   |   0   |
| 2  | efgh   |   0   |
| 3  | ijkl   |   0   |
| 4  | mnop   |   2   |
+----+--------+-------+

id是主键& f_key是外键[对同一表中id的引用]。

SELECT * FROM table_name WHERE id NOT IN (SELECT f_key FROM table_name WHERE f_key !=0);

是否还有其他好的(最短执行时间)MySQL查询来获取这样的输出:

+----+--------+-------+
| id | name   | f_key |
+----+--------+--------
| 1  | abcd   |   0   |
| 3  | ijkl   |   0   |
| 4  | mnop   |   2   |
+----+--------+-------+

编辑::

尝试查询子查询的中等大小结果,但问题是:

  • EXISTS 高速执行 IN :子查询结果时 非常大。

  • IN 超越 EXISTS :子查询结果非常小。

3 个答案:

答案 0 :(得分:0)

在运营商中经常表现不佳。我认为你应该尝试存在

    SELECT * FROM table_name a WHERE NOT Exists(SELECT f_key FROM table_name b WHERE b.f_key = a.id);

如果您可以在f_key中创建索引,则此查询将执行更好的

答案 1 :(得分:0)

使用Return row only if value doesn't exist的常规惯用法,但使用自我加入:

SELECT a.*
FROM table_name AS a
LEFT JOIN table_name AS b ON a.id = b.f_key
WHERE b.id IS NULL

答案 2 :(得分:0)

Here据说,not in或outer join会有更好的表现,但there不存在或不存在获胜......

console.log('\x1b[36m%s\x1b[0m', 'I am cyan');  //cyan