通过条件为

时间:2016-04-19 16:02:20

标签: php mysql sql

我有两个表productcategory,通过映射表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

或许还有另一种更好的方式?

1 个答案:

答案 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;

Read more about EXPLAIN here

最后,第二个更容易阅读,所以走这条路将确保无论谁从你那里接过这个,你就不会有在睡梦中谋杀你的冲动。这是件好事。