MySQL加入MIN时添加列

时间:2014-06-30 08:20:27

标签: mysql sql join

我遇到了MySQL处理连接的问题。

我试图从表格中取出少量信息并将其组合在一起,然后添加其余信息。像这样:

 id    |   pack   |   period   |  name
----   |  ------  |  --------  | ------
 50    |   p1     |    t1      |  test1
 51    |   p2     |    q2      |  test2
 52    |   p3     |    q2      |  testt3
 53    |   p4     |    t1      |  pest4
 54    |   p1     |    t1      |  test5

我希望它像以下一样排序:

 id    |   pack   |   period   |  name
----   |  ------  |  --------  | ------
 50    |   p1     |    t1      |  test1
 54    |   p1     |    t1      |  test5
 53    |   p4     |    t1      |  pest4
 51    |   p2     |    q2      |  test2
 52    |   p3     |    q2      |  testt3

我通过以下方式获得订单:

  • MIN(id)period - First Sort
  • MIN(id)包 - 第二排序

我还在尝试过:

SELECT t1.pack, t1.period, t1.name 
FROM TABLE1 t1
LEFT JOIN (
SELECT MIN(id) as minID, period
FROM TABLE1
GROUP BY pack
) t2
ON t1.period = t2.period
ORDER BY t2.minID

2 个答案:

答案 0 :(得分:0)

您的查询目前在做什么?

SELECT t1.pack, t1.period, t1.name 
FROM TABLE1 t1
LEFT JOIN (
SELECT MIN(id) as minID, period
FROM TABLE1
GROUP BY pack
) t2
ON t1.period = t2.period
ORDER BY t2.minID

首先,我们从table1中找到必要的数据。这可以。接下来,您在table1上有一个左连接。在此左连接中,您将找到给定时间段的最小ID。这个问题就是这个问题。

 id    |   pack   |   period   |  name  |  t2.minID
----   |  ------  |  --------  | ------ | ----------
 50    |   p1     |    t1      |  test1 |  50
 54    |   p1     |    t1      |  test5 |  50
 53    |   p4     |    t1      |  pest4 |  50
 51    |   p2     |    q2      |  test2 |  51
 52    |   p3     |    q2      |  testt3|  51

由于您仅在该时段上执行完全外连接,因此sql将查找该时段的最小ID,然后将该id设置为该时段中所有数据的值,如您所见上面的表。你的查询的方式,t1期间的所有内容都将出现在q2中的所有内容之前,因为50 <51。但是,sql会根据需要对每个时段中的数据进行排序。因此,有时候输出可能是上面显示的,但每次都会以不同的方式排序。

你如何解决这个问题?

Sql已经知道如何订购东西了。您不需要为其提供最小值,只需要提供您要排序的列。 Sql默认按升序对数据进行排序,但您可以通过在订单末尾添加desc来指定按降序排序。

对于您的查询,我建议取出左外连接(因为看起来您只包含它用于订单,并删除它将提高性能)。然后,将订单更改为您在问题中指定的内容t1.period, t1.pack

SELECT  t1.pack, t1.period, t1.name 
FROM    TABLE1 t1
ORDER BY t1.period, t1.pack

如果您的订单中有多个列,则sql将使用第一列进行排序。然后,如果第一列的任何值具有相同的值,则sql将默认为第二列。

答案 1 :(得分:0)

我终于找到了自己答案的答案,对我自己来说太难了:

SELECT t1.id, t1.pack, t1.period, t1.name
FROM (
TABLE1 t1
JOIN (
SELECT *, MIN(id) as minID 
FROM TABLE1 t2
GROUP BY t2.period) t2
ON t2.period= t1.period
) ORDER BY minID, pack

如果您可以选择构建自己的数据库结构,那么人们应该明白这不是解决问题的最佳方法。但是,当你被迫坚持一个特定的结构,这至少有效!希望它可以帮助别人! :)