我的表cities
包含列id
,name
,region_id
和表orders
,其中列为id
,city_id
我需要从orders
中选择所需的所有行region_id
。
使用EXISTS
:
SELECT `o`.`id`
FROM `orders` as `o`
WHERE EXISTS (SELECT `id`
FROM `cities`
WHERE `id` = `o`.`city_id` AND `region_id` = ".$region_id.")
使用JOIN
:
SELECT `o`.`id`
FROM `orders` as `o`
LEFT JOIN `cities` as `c` ON `o`.`city_id` = `c`.`id`
WHERE `c`.`region_id` = ".$region_id."
在这种情况下哪情况更好?
答案 0 :(得分:0)
我认为JOIN
因可读性而更好。很公平,很容易理解Exit
一个,但快速看一下,重复次数更少,更容易阅读。
如果您从性能角度出发,我会建议您在自己的系统上进行基准测试。
如果您正在处理用户输入,我还建议您利用PDO。
答案 1 :(得分:0)
您应该学会使用参数,这样就不会破坏查询字符串。将参数值填充到查询字符串中可能会导致意外的语法错误和SQL注入漏洞。
LEFT JOIN
是多余的。您的WHERE
子句将外连接转换为内连接:
SELECT o.id
FROM orders o JOIN
cities c
ON o.city_id = c.id
WHERE c.region_id = ".$region_id."
(我删除了反引号。它们是不必要的,因此它们只会使查询混乱。)
哪个更好,两者可以做不同的事情。如果JOIN
具有相同cities
的多行,则id
版本可以为给定订单返回多行。不可否认,对于名为id
的列,这不太可能,但语义略微支持EXISTS
。注意:这只是因为您没有从c
中选择任何其他列。如果是这样,那么JOIN
就不费吹灰之力了。
在大多数情况下,选择是品味问题。您可能希望运行这两个版本,检查执行计划,并查看哪些版本的数据更快。