2013-06-21 53 views
1

我試圖從四個表中顯示數據。其中三個表格構成了一對多的關係。我需要根據共享的suit_id將某些數據分組,並且我需要能夠自由地對來自不同表格的字段進行排序。我還需要能夠從不同的表中排序多個字段。MySQL多連接,多重排序維護組

  • 該數據代表法庭記錄中的法律案件(訴訟)。
  • 對於每件套裝都可能有很多派對。
  • 對於任何給定方只有一次收費,並且該party_type將是「被告」。

DB結構:

Highlighted are the fields that I need to sort on. The internal relation of suit_id to parent_suit_id may not be needed. I added it for testing.

以下是我當前的查詢,它返回正確的數據。數據按suit_id正確分組,但排序關閉,我的查詢不允許我控制排序。

SELECT 
s.suit_id, 
s.case_number, 
p.party_id, 
p.name, 
c.charge_id, 
c.charge_code 
FROM suit_party sp 
    LEFT JOIN suit s 
     ON sp.suit_id = s.suit_id 
    LEFT JOIN (  
     SELECT pp.* FROM party pp 
     WHERE pp.party_type != 'Bond Entity' 
     ORDER BY pp.last_name DESC 
    ) p 
    ON sp.party_id = p.party_id 
LEFT JOIN charge c 
    ON p.party_id = c.party_id 
WHERE p.party_id IS NOT NULL 
GROUP BY sp.party_id, sp.suit_id 

樣本輸出

+---------+-------------+----------+------------------+-----------+-------------+ 
| suit_id | case_number | party_id | name    | charge_id | charge_code | 
+---------+-------------+----------+------------------+-----------+-------------+ 
|  1 | 66519GE  |  1 | Trouble, Tony T. |   1 | 262061253 | 
|  1 | 66519GE  |  2 | Law, Officer  |  NULL | NULL  | 
|  2 | 2013A262076 |  3 | Bad, Bobby B. |   2 | 0528  | 
|  2 | 2013A262076 |  5 | Police, Peter |  NULL | NULL  | 
|  3 | A357654KK |  6 | Krook, Kimberly |   3 | 2143  | 
|  3 | A357654KK |  7 | Crime, Capn  |  NULL | NULL  | 
|  4 | B357654KK |  8 | Krook, Kimberly |   4 | 0660  | 
|  4 | B357654KK |  9 | Law, Officer  |  NULL | NULL  | 
+---------+-------------+----------+------------------+-----------+-------------+ 

我希望能夠通過名稱和charge_code同時保持suit_id的正確分組進行排序。

http://www.sqlfiddle.com/#!2/e6daf9

+0

爲什麼不添加GROUP BY sp.party_id,sp.suit_id,p.name,c.charge_code?然後它會在party_id和suit_id映射中按名稱和charge_code進行排序。 – kuriouscoder

+0

剛纔試過,它並沒有影響排序。訂單保持不變。 – swilsonmcss

+0

在子查詢中更改ORDER BY子句也不會影響訂單。 – swilsonmcss

回答

1

的問題與您order by是要包括sp.party_id。該對唯一定義了每一行,因此不需要其他排序標準。

我認爲這將解決您的問題:

order by sp.suit_id, p.name, c.charge_code 
+0

我想你是指我的GROUP BY(我編輯了你的帖子)。我嘗試了你的建議,並按照二級和三級條款進行分組。我正在尋找排序輸出,例如,按字母或數字按給定的字段排序。所以,雖然它們被正確地分組,但是輸出不是順序的。感謝您關於sp.party_id不必要的觀點。 – swilsonmcss

1

我懷疑大部分的問題是,你有沒有標準化的數據。對於看起來是同一個人的人,你有多個partyid。 (法律官員和Kimberly Crook是兩個)你需要在你的派對錶中只有一個條目,然後使用partyid作爲FK其他地方更有意義。您基本上已經告訴您的應用程序,LO和KC的實例是具有相同名稱的不同人員。那麼爲什麼要把它們放在一起呢?

你應該先重寫你的測試數據:

INSERT INTO `party` (`party_id`, `name`, `first_name`, `middle_name`, `last_name`, `suffix`, `original_address`, `address`, `address2`, `city`, `state`, `zip`, `zip4`, `race`, `gender`, `dob`, `party_type`, `party_status`, `last_updated`, `avs_status`, `avs_message`) VALUES 
(1, 'Trouble, Tony T.', 'Tony', 'T.', 'Trouble', '', '4338 My Street River TX 12345', NULL, NULL, NULL, NULL, NULL, NULL, 'White', 'M', '09/29/1987', 'Defendant', NULL, '06/16/2013', NULL, NULL), 
(2, 'Law, Officer', NULL, NULL, NULL, NULL, '123 Police Street', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Officer', NULL, '06/12/2013', NULL, NULL), 
(3, 'Bad, Bobby B.', 'Bobby', 'B.', 'Bad', '', '3463 Some Rd. Bend, MS 32432', NULL, NULL, NULL, NULL, NULL, NULL, 'White', 'M', '04/19/1960', 'Defendant', NULL, '06/19/2013', NULL, NULL), 
(4, 'Bond, Barbara', NULL, NULL, NULL, NULL, '546 Bond Street', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Bond Entity', NULL, '06/07/2013', NULL, NULL), 
(5, 'Police, Peter', NULL, NULL, NULL, NULL, '123 Police Street', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Officer', NULL, '06/06/2013', NULL, NULL), 
(6, 'Krook, Kimberly', 'Kimberly', '', 'Krook', '', '23423 Kims Place Kimtown, KS 32343', NULL, NULL, NULL, NULL, NULL, NULL, 'White', 'M', '07/11/1993', 'Defendant', NULL, '06/14/2013', NULL, NULL), 
(7, 'Crime, Capn', NULL, NULL, NULL, NULL, '123 Police Street', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Officer', NULL, '06/14/2013', NULL, NULL), 

INSERT INTO `suit_party` (`suit_party_id`, `suit_id`, `party_id`) VALUES 
(1, 1, 1), 
(2, 1, 2), 
(3, 2, 3), 
(4, 2, 4), 
(5, 2, 5), 
(6, 3, 6), 
(7, 3, 7), 
(8, 4, 6), 
(9, 4, 2); 

在這個小提琴。 http://www.sqlfiddle.com/#!2/e771b/3

對於速度,我已經刪除了FK限制,我接受有這方面的工作要做,但最終我希望它能證明你需要什麼。通過擺弄順序,你可以得到我認爲你現在要問的東西...

+0

對不起,我搞錯了原來公佈的交易的樣本數據。我現在用這個替換了交易:[link](http://www.sqlfiddle.com/#!2/78192/1)。所以,是的,Kimberly Krook和Officer Law是同一個人,但是,他們不止一次進入,因爲他們都是兩個單獨訴訟的當事人。我現在更正了樣本數據以反映正確的案例編號。 – swilsonmcss