1

我正在尝试显示四个表中的数据。其中三个表构成一对多关系。我需要根据共享的 suit_id 对某些数据进行分组,并且我需要能够对来自不同表的字段进行自由排序。我还需要能够对来自不同表的多个字段进行排序。

  • 数据代表法庭记录中的法律案件(诉讼)。
  • 对于每件西装,可能有很多派对。
  • 任何一方将只收取一项费用,并且该 party_type 将是“被告”。

数据库结构:

突出显示的是我需要排序的字段。可能不需要 suit_id 与 parent_suit_id 的内部关系。我添加它以进行测试。

以下是我当前的查询,它返回正确的数据。数据按 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

4

2 回答 2

1

我怀疑你的大部分问题是你没有标准化数据。您有多个派对,似乎是同一个人。(Law Officer 和 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 限制,我接受在这方面还有工作要做,但最终我希望它能够证明你的需要。通过摆弄订单,你可以得到我认为你现在要问的......

于 2013-06-22T01:01:25.540 回答
1

你的问题order by是你包括sp.party_id. 该对唯一地定义每一行,因此不需要其他排序标准。

我认为这将解决您的问题:

order by sp.suit_id, p.name, c.charge_code
于 2013-06-22T00:34:17.447 回答