我试图查询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个查询更好吗?
谢谢,
- 戴恩
我将在两个查询中执行此操作。问题不在于效率或各自表的大小,问题在于您在shop_rigs_images和shop_rigs_parts之间创建了笛卡尔积。
意思是,如果一个给定的行shop_rig有三个图像和四个部分,您将得到3x4 = 12行对于单个shop_rig。
我是这样写的:
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的观点,你应该只选择你需要从一个给定的查询列,而不是所有的列与*
。
如果要从第一个表中提取大量数据,那么最好执行两个查询。
另外,为了提高效率,最好指定实际需要的每一列,而不是所有列,这样可以获取和检索更少的数据。
连接通常比运行2个查询更有效,只要您在索引上连接,但这取决于您的数据和索引。您可能想要运行"explain SELECT ....."为两个选项,并比较"可能的键"answers"行"从您的结果。