SQL - Max Vs内部联接

时间:2015-06-11 10:36:39

标签: sql join optimization max

我有一个问题,就速度而言,哪种方法更好。 我有一个包含2个表的数据库,如下所示:

表2

UniqueID价格

1 100
2 200
3 300
4 400
5 500

表1

UniqueID用户
1汤姆
2汤姆
3杰里
4杰里
5杰里

我想获得每个用户的最高价格,现在我面临两个选择:

使用Max或使用以下帖子中建议的内部联接:Getting max value from rows and joining to another table

哪种方法更有效?

1 个答案:

答案 0 :(得分:1)

您的问题的答案是尝试这两种方法,并查看哪种方法可以更快地处理环境中的数据。除非您拥有大量数据,否则差异可能并不重要。

在这种情况下, if ($packageDb->service_type_id == ServiceType::TYPE_SIP) { $summary[service_type] = $packageDb->service_type_id; } if ($packageDb->service_type_id == ServiceType::TYPE_LANDLINE) { $summary[service_type] = $packageDb->service_type_id; } return View::make("order.order-billing")->with('summary', $summary); 的传统方法可能更好:

  @if ($summary['service_type'] == ServiceType::TYPE_SIP) 
    ..
  @endif

对于此类查询,您需要group by上的索引,也可能需要select u.user, max(p.price) from table1 u join table2 p on u.uniqueid = p.uniqueid group by u.user; 上的索引。这取决于数据库引擎。

我会建议table2(uniqueid, price)

而不是table1(uniqueid, user)
join

请注意,这些完全相同的事情。无论如何,第一个将返回每个用户一行。如果有多个行具有相同的价格,则此版本可以返回多行。另一方面,它可以以最高价格返回行中的其他列,这很方便。

因为您的数据结构在子查询中需要not exists,所以我认为您应该坚持使用select u.user, p.price from table1 u join table2 p on u.uniqueid = p.uniqueid where not exists (select 1 from table1 u2 join table2 p2 on u2.uniqueid = p2.uniqueid where p2.price > p.price ); 方法。