2015-11-08 95 views
0

说我需要从几个表中提取数据,就像这样:选择单个最大值

item 1 - from table 1 
item 2 - from table 1 
item 3 - from table 1 - but select only max value of item 3 from table 1 
item 4 - from table 2 - but select only max value of item 4 from table 2 

我的查询很简单:

select 
    a.item 1, 
    a.item 2, 
    b.item 3, 
    c.item 4 
from table 1 a 
left join (select b.key_item, max(item 3) from table 1, group by key_item) b on a.key_item = b.key_item 
left join (select c.key_item, max(item 4) from table 2, group by key_item) c on c.key_item = a.key_item 

我不知道如果我拉的方法只是一个来自表格的单个最大项目是最有效的。假设两个表都超过一百万行。我的实际SQL使用这个SQL安装程序永远运行。

编辑:我改变了小组的条款,以反映评论。我希望现在有点意义?

+0

您应该使用您正在运行的实际SQL编辑您的问题。你写的查询没有意义。您正在聚合一组列,然后选择其他列。 –

+0

我的实际SQL完全像这样,表和列的名称已更改。为什么查询没有意义?我只是希望获得特定项目的最大值而不是整行,那么为什么要聚合整个行? – user2022284

+2

你能告诉我们样本数据和欲望输出吗? –

回答

1

最好的办法是对table1table2添加索引,如下所示:

ALTER TABLE table1 
ADD INDEX `GoodIndexName1` (`key_item`,`item3`) 

ALTER TABLE table2 
ADD INDEX `GoodIndexName2` (`key_item`,`item4`) 

这将允许您使用queries as described in the MySQL documentation寻找行控股集团明智的最大值,这似乎成为你正在寻找的东西。

您的原始(编辑)查询应该工作:

select 
    a.item1, 
    a.item2, 
    b.item3, 
    c.item4 
from table1 a 
LEFT OUTER JOIN (
    SELECT 
    b.key_item, 
    MAX(item3) AS item3 
    FROM table1 
    GROUP BY key_item 
) b 
ON a.key_item = b.key_item 
LEFT OUTER JOIN (
    SELECT 
    c.key_item, 
    MAX(item4) 
    FROM table2 
    GROUP BY key_item 
) c 
ON c.key_item = a.key_item 

,如果在添加索引后执行缓慢,请尝试以下操作太:

SELECT 
    a.item1, 
    a.item2, 
    b.item3, 
    c.item4 
FROM table1 a 
LEFT OUTER JOIN table1 b 
ON b.key_item = a.key_item 
LEFT OUTER JOIN table1 larger_b 
ON larger_b.key_item = b.key_item 
AND larger_b.item3 > b.item_3 
LEFT OUTER JOIN table2 c 
ON c.key_item = a.key_item 
LEFT OUTER JOIN table2 larger_c 
ON larger_c.key_item = c.key_item 
AND larger_c.item4 > c.item4 
WHERE larger_b.key_item IS NULL 
AND larger_c.key_item IS NULL 

(我已经修改了表和列名称只是略微,以便它们符合正确的MySQL语法。)

我使用上述结构的查询一直工作,并且它们非常高效地执行inde xes就像我提供的那个。

也就是说,通常我在bc表上使用INNER JOIN,但我不明白为什么你的查询应该有任何问题。

如果仍然遇到性能问题,请为每个表报告key_item列的数据类型,就好像您试图加入不同的数据类型一样,通常您的性能会很差。

+0

精彩的@Willem将于明天上午执行并报告。谢谢 – user2022284

+0

第二个解决方案工作。它比第一个要快得多。谢谢。我想了解一下这种方法 - 一种学习体验。我得到了关于将表加入自身并比较我们正在寻找的最大值的字段的部分。我没有得到为更大的_c.key_item指定空值的部分。这到底是什么? – user2022284

+0

到'larger_c'表的连接是为了连接所有大于'c'表中记录的记录。如果我们然后指定'greater_c'记录不应该存在,那么通过要求非空列为null(在这种情况下为'key_item'列),那么我们只从'c'表中获得记录没有更大的'item4'值。也就是说,具有item4最大值的记录。 –

0

我对你的版本做了一些修改,也许它现在会返回你想要得到的结果。

select item 1, item 2, max3, max4 from 
(
select 
    item 1, 
    item 2, 
    1 as max1, 
    1 as max2 
from table 1)a 
left join (select 1 as max1, max(item 3) as max3 from table 1) b on a.max1 = b.max1 
left join (select 1 as max2, max(item 4) as max4 from table 2) c on c.max2 = a.max2 
) 
+0

我对“1 as max1”和“1 as max2”有点困惑。表1和2中是否有这些键?如果不是,我如何在每个表中使用主键来加快速度 - 假设表1和表2共享一个键。 – user2022284

+0

这不起作用。为所有行拉取一个最大值。 – user2022284