我有两个存储成员数据的表
成员: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的情况下执行此操作?
谢谢
答案 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中没有相应的行