Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过具有条件的映射表连接表_Php_Mysql_Sql - Fatal编程技术网

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
子句。再次感谢。你还帮助我将来如何解决我的问题:)