仅按来自左连接查询

时间:2017-10-25 18:22:50

标签: mysql sql database

我有两张桌子1.人和2.孩子

CREATE TABLE Persons (
PersonID int,
Name varchar(255)
);

CREATE TABLE Children (
ChildID int,
PersonID int,
Name varchar(255),
DOB Date);

我将它们与左连接组合在一起。

select 
person.PersonID
, person.Name
, child.childID
, Child.DOB
FROM(
select PersonID
, Name
From Persons
) as person

left join (
select ChildID
, PersonID
, Name
, DOB
From Children
Order By DOB ASC
) as child
on child.PersonID = person.PersonID

结果显示一个人的出生日期与孩子的关系。直到那时这很好。我想要的人将按照他们的身份和儿童名单进行升序排序。他们的出生日期将按照升序排序。但似乎孩子们是按随机顺序来的。我试图按结果排序,但这不符合我的目的。 我想要PersonID升序,每个人的子列表将按其出生日期的升序排序。

以下是我执行的表和查询的链接http://sqlfiddle.com/#!9/b56f95/3

3 个答案:

答案 0 :(得分:1)

您的查询未明确排序,在这种情况下,它们似乎是由PersonID排序的,但并不总能保证。子查询的顺序也不会改变外部查询的顺序。

如果将订单从子查询移到外部查询中,输出将被正确排序:

select 
  person.PersonID
  , person.Name
  , child.childID
  , Child.DOB
FROM(
  select PersonID
  , Name
  From Persons
) as person

left join (
  select ChildID
  , PersonID
  , Name
  , DOB
  From Children
) as child
on child.PersonID = person.PersonID
order by child.DOB

如果您希望将每个父母的孩子列在一起,例如:

Parent 1, Child 1
Parent 1, Child 2
Parent 2, Child 1
Parent 3, Child 1
Parent 3, child 2

您也可以按PersonID添加订单:

select 
  person.PersonID
  , person.Name
  , child.childID
  , Child.DOB
FROM(
  select PersonID
  , Name
  From Persons
) as person

left join (
  select ChildID
  , PersonID
  , Name
  , DOB
  From Children
  Order By DOB ASC
) as child
on child.PersonID = person.PersonID
order by person.PersonID, child.DOB

这将首先通过人员表中的PersonID对结果进行排序,然后通过他们的DOB对每个父母的子女进行排序

答案 1 :(得分:0)

即使您明确排序,JOIN也不会保留您的行排序。您需要在之后进行排序:

SELECT 
  person.PersonID
  , person.Name
  , child.childID
  , Child.DOB
FROM Persons AS person
LEFT JOIN Children AS child
ON child.PersonID = person.PersonID
ORDER BY PersonID, DOB

我删除了ORDER BY中的JOIN,并在外部查询的末尾添加了一个。{/ p>

我还优化了SELECTJOIN中的子查询,因为您可以使用FROM Persons AS personLEFT JOIN Children AS child来完成同样的事情。

答案 2 :(得分:0)

您可以简化查询并按两列排序结果:

select 
person.PersonID
, person.Name
, child.childID
, Child.DOB
From Persons as person
left join Children as child
on child.PersonID = person.PersonID
Order By PersonID, DOB

逻辑上,在创建查询结果后应用ORDER BY。在这种情况下,它是一个简单的ORDER BY,首先是ID,然后是DOB。