Php MySQL多连接、多排序维护组

Php MySQL多连接、多排序维护组,php,mysql,join,group-by,sql-order-by,Php,Mysql,Join,Group By,Sql Order By,我试图显示四个表中的数据。其中三个表构成一对多关系。我需要根据共享id对某些数据进行分组,并且我需要能够对不同表中的字段进行自由排序。我还需要能够对不同表中的多个字段进行排序 这些数据代表法庭记录中的法律案例(诉讼) 每件诉讼可能有许多当事人 任何一方只需提出一项指控,该方类型将为“被告” DB结构: ! 下面是我当前返回正确数据的查询。数据按suit_id正确分组,但排序已关闭,并且我的查询不允许我控制排序 SELECT s.suit_id, s.case_number, p.party_

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

  • 这些数据代表法庭记录中的法律案例(诉讼)
  • 每件诉讼可能有许多当事人
  • 任何一方只需提出一项指控,该方类型将为“被告”
DB结构:

!

下面是我当前返回正确数据的查询。数据按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        |
+---------+-------------+----------+------------------+-----------+-------------+
我希望能够按姓名和收费代码排序,同时保持西装id的正确分组


您的
订购人的问题在于您包含了
sp.party\u id
。该对唯一地定义了每一行,因此不需要其他排序条件

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

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

我怀疑你的大部分问题是你没有将数据标准化。对于看起来是同一个人的对象,您有多个PartyID。(法务官和金伯利·克鲁克是两个人)你只需要在你的party表中为他们每个人设置一个条目,那么在其他地方使用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);
就像这把小提琴


对于速度,我已经消除了FK的限制,我接受在这方面还有工作要做,但最终我希望它能证明您需要什么。通过摆弄订单,您可以得到我认为您现在想要的…

为什么不按sp.party\u id、sp.suit\u id、p.name、c.charge\u代码添加组?然后它会在party\u id和suit\u id映射中按名称和收费代码进行排序。刚刚尝试过,但没有影响排序。顺序保持不变。更改子查询中的order BY子句也不会影响顺序。尝试此操作后能否粘贴结果?我希望能够随意调整排序。包括对样本输出中未表示的字段进行排序(即p.last_name、p.state等)。我想你指的是我的分组人(我编辑了你的帖子)。我试了一下你的建议,它是按第二和第三分句分组的。我希望对输出进行排序,比如按给定字段的字母或数字排序。因此,尽管它们被正确分组,但输出不是连续的。谢谢你关于sp.party_id不必要的观点。对不起,我把我最初发布的交易样本数据弄错了。我现在已将该事务替换为以下内容:。所以,是的,金伯利·克罗克(Kimberly Krook)和警官·劳(Officer Law)是同一个人,然而,他们不止一次参与,因为他们都是两个独立诉讼的当事人。我现在更正了样本数据,以反映正确的病例数。