我有两个表product
和category
,通过映射表product_category
加入。
*** product ***
int id, varchar name, ... more columns
*** category ***
int id, varchar name
*** product_category ***
int product_id, int category_id
我想选择具有特定名称的所有类别的产品。我已经看到了SQL JOIN using a mapping table的答案,这导致我创建了这些有效的SQL查询,但哪一个是最佳实践/更高效?(我没有经验的SQL)
在AND
中使用JOIN
子句:
SELECT
p.*
FROM
category c
JOIN product_category pc
ON c.id = pc.category_id
AND c.name = ?
JOIN product p
ON p.id = pc.product_id
ORDER BY p.name
或使用WHERE
子句:
SELECT
p.*
FROM
category c
JOIN product_category pc
ON c.id = pc.category_id
JOIN product p
ON p.id = pc.product_id
WHERE
c.name = ?
ORDER BY p.name
或许还有另一种更好的方式?
答案 0 :(得分:1)
这些实际上是相同的,也是最直接的数据路径。
您必须在FROM
中建立表格与两个查询中的关系。然后,您必须使用c.name = ?
条件限制结果集中的数据,这是您在两个查询中都已完成的。
MySQL的优化器很可能以完全相同的方式执行这两个查询。当然,您可以在两者上运行EXPLAIN
并查看是否存在任何差异。例如:
EXPLAIN SELECT
p.*
FROM
category c
JOIN product_category pc
ON c.id = pc.category_id
AND c.name = ?
JOIN product p
ON p.id = pc.product_id
ORDER BY p.name;
最后,第二个更容易阅读,所以走这条路将确保无论谁从你那里接过这个,你就不会有在睡梦中谋杀你的冲动。这是件好事。