只返回 MySQL 查询的第一个结果

10

在我的一个应用程序中,我必须确定表格 'foo_table' 的 'foo' 列中是否存在 'foo_id'。

只要我知道有一个这样的 'foo_id' 存在,我的需求就得到满足了。 现在,我的问题是如何限制只匹配第一个结果。

当我使用 mySql EXPLAIN 检查这些查询时:

- select count(foo) from foo_table where foo=<foo_id>;
- select foo from foo_table where foo=<foo_id> limit 1;

在这两种情况下,行数都是58。 是否有一种在mySql中可以限制行数为1(第一个匹配项),以便不必要地触及行(因为我不需要那些行)。


1
你确定 "select foo from foo_table where foo=<foo_id> limit 1; " 会返回58行数据吗? - Somnath Muluk
1
是的,通过 "explain select foo from foo_table where foo=<foo_id> limit 1;" 至少显示了 'rows' 列为58。 - TJ-
1
不要看 EXPLAIN,直接执行查询。 - xkeshav
4个回答

13

执行计划始终会显示 58,因为它是与您的条件匹配的记录数。

然而,只需要 LIMIT 1。


好的。这是否意味着当我实际执行查询时,只会涉及1行? - TJ-

2
您可以这样使用EXISTSSELECT EXISTS(SELECT 1 FROM foo_table WHERE foo=<foo_id>)
由于EXISTS仅检查WHERE子句,因此将忽略SELECT。由于避免使用*是良好的实践,因此在此处将其替换为1
这是文档

这仍然显示与“EXPLAIN”中匹配条件的行数相同,但最好使用“LIMIT 1”来检查是否存在行。 - Cameron S

0

LIMIT 1 是正确的方法,所以你已经自己找到了解决方案:

SELECT 1 FROM foo_table WHERE foo = ? LIMIT 1

0

以下的explain MySQL语句显示的是总行数,而不是你在Limit中指定的行数:

explain select foo from foo_table where foo=<foo_id> limit 1

输出

+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | foo_table   | ALL  | NULL          | NULL | NULL    | NULL |    58 |       | 
+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接