2014-06-30 73 views
0

我遇到了MySQLs處理連接的問題。MySQL在加入MIN時添加列

我試圖從表中取出少量信息並將其組合在一起,然後添加其餘的信息。事情是這樣的:

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)期 - 第一個排序
  • MIN(id)package - Second Sort

我已經試過尚未:

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 
+3

什麼是您的完整查詢? –

+0

PLZ分享您的架構結構。 –

回答

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 

人們應該明白,這是不是如果你必須建立選項來解決該問題的最佳方式你自己的數據庫結構。但是當你被迫堅持一個特定的結構時,這至少可以起作用!希望它可以幫助別人! :)

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將默認爲第二列。

+0

嗨!昨天我發現它時,我正在試圖回答我自己的問題,但沒有成功(猜測我的學分太少)。如果我說讓你的命令不會解決我的問題,那麼在time1之後有一段叫another_time1的時期,因爲它是按字母順序排列的。這就是問題背後的全部原因,如何在最小的id上進行排序,但正如我所說的,我找到了答案:'SELECT t1.id,t1.pack,t1.period,t1.nameFROM(TABLE1 t1JOIN(SELECT * ,MIN(id)as minIDFROM TABLE1 t2GROUP BY t2.period)t2 ON t2.period = t1.period)ORDER BY minID,pack' – user2687506

+0

@ user2687506我現在明白了。您正嘗試根據具有最小ID的那個排序。我仍然建議不要這樣做,因爲您正在創建自聯接以更改排序。通常你可以更好地在其他代碼中排序數據。另外,我並不完全同意將id用作任何信息,除非它們的意思是id。但是,我可以認識到某些規格可能不在您的控制範圍之內。自從您提出問題24小時後(或類似情況),您應該能夠回答問題。 – Jenn

+0

我完全理解,它不僅僅是使用ID作爲鍵而是做自我連接的最佳選擇。 Unfourtunatley我還沒有找到任何能夠讓我朝更好的方向發展的人。問題是我需要根據它們被插入表的時間來排序這些時間段(從一開始這是一個糟糕的創建,但沒有我真的可以做任何事情..使用多個系統與多個用戶會產生問題)。 – user2687506