Php 通过具有条件的映射表连接表
我有两个表,Php 通过具有条件的映射表连接表,php,mysql,sql,Php,Mysql,Sql,我有两个表,product和category,通过映射表product\u category连接在一起 *** product *** int id, varchar name, ... more columns *** category *** int id, varchar name *** product_category *** int product_id, int category_id 我想选择某一类别中具有特定名称的所有产品。我已经看到了的答案,这让我创建了这些工作SQL
product
和category
,通过映射表product\u category
连接在一起
*** product ***
int id, varchar name, ... more columns
*** category ***
int id, varchar name
*** product_category ***
int product_id, int category_id
我想选择某一类别中具有特定名称的所有产品。我已经看到了的答案,这让我创建了这些工作SQL查询,但是哪一个是最佳实践/更高效的?(我对SQL没有经验)
在连接中使用和子句:
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
或者也许还有另一种更好的方法?这些方法实际上是相同的,也是获取数据最直接的途径
您必须从
在两个查询中建立表之间的关系。然后,您必须使用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;
最后,第二条更容易阅读,因此走这条路将确保无论谁从你手中接过这条路,都不会有在你睡觉时谋杀你的冲动。这是件好事。谢谢!今天晚些时候回家时,我将尝试使用EXPLAIN
。我会让你知道的!是的,在使用EXPLAIN
之后,两个查询是相同的。它在优化器中将和子句转换为WHERE
子句,因此我肯定使用可读性更高的WHERE
子句。再次感谢。你还帮助我将来如何解决我的问题:)