MySql查询:按两个表中的两个字段排序

时间:2010-01-30 11:30:54

标签: mysql sql-order-by

我有两个存储成员数据的表

成员:id,field1,field2和field3 ......

members_extra:memberId,someExtraField1和someExtraField2

members_extra.memberId是引用members.id的外键

'members_extra'可能有也可能没有'members'

中行的相关行

让我们说:'成员'中有1000个成员,而'member_extra'中有50行包含额外信息

现在我想搜索'成员'并根据'member.field2'订购结果...但我想要在没有额外信息的人之前列出有额外信息的成员(在members_extra中)< / p>

现在我使用member.field3作为ENUM('true','false'),它指示此成员是否有额外的信息,并按如下顺序排序:ORDER BY field3 ASC,field2 ASC ...这样可以正常工作,但是我不喜欢这种方法,因为每次插入或删除members_extra中的内容时我都必须更新members.field3

如何在不使用members.field3的情况下执行此操作?

谢谢

4 个答案:

答案 0 :(得分:1)

您可以在member_extra.memberId是否存在的情况下包含ORDER BY:

SELECT *
FROM members
LEFT JOIN members_extra
ON members.id = members_extra.memberId
ORDER BY members_extra.memberId IS NULL, members.field2

现在您不需要members.field3,您可以从架构中删除它。这将使您的数据库更接近标准化形式。

答案 1 :(得分:0)

order by member_extra.something desc 

首先,我相信在非NULL之后列出NULL,或者

order by case when member_extra.something IS NOT NULL 1 else 2 end

答案 2 :(得分:0)

SELECT members.id, 
       members.field1, 
       members_extra.someExtraField1,
       Ordering = CASE members_extra.memberId WHEN NULL THEN 'Z' ELSE 'A' END 
   FROM members 
        LEFT JOIN 
        members_extra ON members.Id = members_extra.memberId
  ORDER BY Ordering

答案 3 :(得分:0)

非常感谢你

这有效!!!

    SELECT * FROM members LEFT JOIN members_extra ON members.id = members_extra.memberId ORDER BY members_extra.memberId IS NULL, members.field2`enter code here`

这会出现错误:

SELECT members.id, members.field1, members_extra.someExtraField1,
     

Ordering = CASE members_extra.memberId WHEN NULL那么'Z'ELSE'A'END   FROM成员LEFT JOIN members_extra ON members.Id = members_extra.memberId   订购订单

应该是这样的:

  

块引用

SELECT members.id, members.field1, members_extra.someExtraField1,
     

CASE members_extra.memberId WHEN NULL那么1 ELSE 0 END AS Ordering   FROM成员LEFT JOIN members_extra ON members.Id = members_extra.memberId   订购订单

     

块引用

虽然有一件奇怪的事情......当我使用最后一个查询时,我总是得到排序= 1 ..即使在members_extra中没有相应的行