我想从表PROD收集有关包含特定三元组值的行的所有详细信息。例如,我想获取具有值(235,39,0232)和(3423,5,09384)等列(ID,NBR和COP_I)的行上的所有数据。
我想知道一种通过Join选择三元组行的方法,这可能比我在下面的方式更好,因为它目前不起作用。
以下查询会生成与前100行相关联的所需三元组:
SELECT ID, NBR, COP_I, SUM(PAD_MN) AS PAD_MN_SUMMED
FROM PROD
WHERE
PROD.FLAG = 0
GROUP BY 1,2,3
ORDER BY 4 DESC, 3,2,1
LIMIT 100 --TOP 100 ROWS
我尝试按以下方式加入上面的查询,以获取与前100行三元组相对应的所有详细信息:
SELECT PROD.ID, PROD.NBR,PROD.COP_I,PROD.FLAG,PROD.TYPE,PROD.DATE, PROD.PAD_MN
FROM ( SELECT ID, NBR, COP_I, SUM(PAD_MN) AS PAD_MN_SUMMED
FROM PROD
WHERE
PROD.FLAG = 0
GROUP BY 1,2,3
ORDER BY 4 DESC, 3,2,1
LIMIT 100) TAB2
INNER JOIN PROD
ON (PROD.ID = TAB2.ID
AND PROD.NBR = TAB2.NBR
AND PROD.COP_I = TAB2.COP_I)
但是,上面的查询为我提供了甚至与任何三元组无关的行。 我觉得我可能在加入时犯了一个错误,但我不知道为什么以及如何纠正它。使用下面提供的答案时,我遇到了类似的问题
更新
包含10,000多行的PROD表类似于:
ID NBR COP_I FLAG TYPE DATE PAD_MN
3423 5 09384 0 BA 14-06-2016 18657.43
546 1098 098 1 CFA 22-03-1998 2394566.92
3423 5 09384 0 AA 28-11-2013 3423534.12
23534 99 0232 0 BA 05-01-2016 7304567.12
结果必需,包含仅前100行信息:
ID NBR COP_I FLAG TYPE DATE PAD_MN
23534 99 0232 0 BA 05-01-2016 17370567.09
3423 5 09384 0 AA 28-11-2013 6321009.98
但是,我的查询的输出给出了行,这些行具有三元组(ID,NBR,COP_I),这些三元组实际上不是从上面的第一个查询输出的,它产生所需的三元组。
答案 0 :(得分:1)
如果我正确理解你,这就是你想要的
join
select prod.* from (select id, nbr, cop_i, sum(pad_mn) as pad_mn_total from prod where prod.flag = 0 group by 1,2,3 order by 4 desc,3,2,1 limit 100) as top_prod left join prod using (id, nbr, cop_i);
没有join
select prod.* from (select id, nbr, cop_i, sum(pad_mn) as pad_mn_total from prod where prod.flag = 0 group by 1,2,3 order by 4 desc,3,2,1 limit 100) as top_prod, prod where prod.id = top_prod.id and prod.nbr = top_prod.nbr and prod.cop_i = top_prod.cop_i;
更好的方法是使用join。在生产模式下使用查询之前,强烈建议您检查explain
响应,以了解mysql将如何收集数据以及索引如何为每个查询工作。
您可以在此处找到有关join
http://dev.mysql.com/doc/refman/5.7/en/join.html
如何使用http://dev.mysql.com/doc/refman/5.7/en/using-explain.html
中描述的explain
BTW:阅读手册是解决问题的好方法
UPD :在评论中进行了一些讨论后:
问:有没有办法阻止这些"分组"在恢复行的同时仍然只检索100个排序行所需的其他信息?答:select sum(pad_mn) as pad_mn_total, prod.* from prod where prod.flag = 0 group by id,nbr,cop_i order by 1 desc,cop_i,nbr,id limit 100