我正在尝试查询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次查询会更好吗?
谢谢,
答案 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 .....”,并比较结果中的“可能的键”和“行”。