PHP MYSQL查询多个表其中第二个表返回多行

时间:2011-08-19 20:44:24

标签: php mysql multiple-tables

我正在尝试查询2个表,其中第一个表将返回1行,第二个表将返回多行。所以基本上第一个表在页面上有返回文本,第二个表将返回一个将在页面内的列表。两个表都有一个引用行,这是两个表的查询。 (见下文)

SELECT shop_rigs.*, shop_rigs_images.*, shop_rigs_parts.*
    FROM shop_rigs
    LEFT JOIN shop_rigs_images 
        ON shop_rigs.shoprigs_ref = shop_rigs_images.shoprigsimg_ref 
    LEFT JOIN shop_rigs_parts
        ON shop_rigs.shoprigs_ref = shop_rigs_parts.shoprigsparts_ref 
    WHERE shoprigs_enabled='1' AND shoprigs_ref='$rig_select'
    ORDER BY shoprigs_order ASC

只做2次查询会更好吗?

谢谢,

  • 戴恩

3 个答案:

答案 0 :(得分:1)

我会在两个查询中执行此操作。问题不在于效率或各个表的大小,问题是你在shop_rigs_images和shop_rigs_parts之间创建了一个Cartesian product

这意味着如果给定的shop_rigs行有三个图像和四个部分,那么对于那个shop_rig,你将得到3x4 = 12行。

所以这就是我写的方式:

SELECT ...
FROM shop_rigs
INNER JOIN shop_rigs_images 
    ON shop_rigs.shoprigs_ref = shop_rigs_images.shoprigsimg_ref 
WHERE shoprigs_enabled='1' AND shoprigs_ref='$rig_select'
ORDER BY shoprigs_order ASC

SELECT ...
FROM shop_rigs
INNER JOIN shop_rigs_parts
    ON shop_rigs.shoprigs_ref = shop_rigs_parts.shoprigsparts_ref 
WHERE shoprigs_enabled='1' AND shoprigs_ref='$rig_select'
ORDER BY shoprigs_order ASC

我离开了列的选择列表,因为我同意@Doug Kress,您应该只选择给定查询所需的列,而不是所有*列。

答案 1 :(得分:0)

如果您从第一个表中提取大量数据,那么最好进行两次查询。

另外,为了提高效率,最好指定实际需要的每个列,而不是所有列 - 这样,将获取和检索更少的数据。

答案 2 :(得分:0)

连接通常比运行2个查询更有效,只要您加入索引,但这取决于您的数据和索引。 您可能希望为这两个选项运行“解释SELECT .....”,并比较结果中的“可能的键”和“行”。