我遇到了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
我通过以下方式获得订单:
我还在尝试过:
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
答案 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
如果您可以选择构建自己的数据库结构,那么人们应该明白这不是解决问题的最佳方法。但是,当你被迫坚持一个特定的结构,这至少有效!希望它可以帮助别人! :)