加入不产生所需的结果

时间:2016-07-08 20:57:41

标签: mysql sql join toad

我想从表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),这些三元组实际上不是从上面的第一个查询输出的,它产生所需的三元组。

1 个答案:

答案 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

相关问题