我正在尝试创建一个涉及另一个表中某些记录计数的自定义排序。例如,如果一个记录在另一个表中没有与之关联的记录,则它应该在排序中显得高于具有一个或多个记录的记录。这是我到目前为止所做的:
SELECT People.*, Organizations.Name AS Organization_Name,
(CASE
WHEN Sent IS NULL AND COUNT(SELECT * FROM Graphics WHERE People.Organization_ID = Graphics.Organization_ID) = 0 THEN 0
ELSE 1
END) AS Status
FROM People
LEFT JOIN Organizations ON Organizations.ID = People.Organization_ID
ORDER BY Status ASC
COUNT
中的子查询无效。做这样的事的正确方法是什么?
更新:我将案例陈述移至order by
子句并添加了join
:
SELECT People.*, Organizations.Name AS Organization_Name
FROM People
LEFT JOIN Organizations ON Organizations.ID = People.Organization_ID
LEFT JOIN Graphics ON Graphics.Organization_ID = People.Organization_ID
GROUP BY People.ID
ORDER BY
CASE
WHEN Sent IS NULL AND Graphics.ID IS NULL THEN 0
ELSE 1
END ASC
因此,如果People
记录没有任何图形,Graphics.ID
将为空。这实现了迫切需要。
答案 0 :(得分:0)
如果您尝试的内容不起作用,可以通过加入子查询并将CASE
表达式也放入ORDER BY
来完成:
SELECT
People.*,
orgcount.num
FROM People JOIN (
SELECT Organization_ID, COUNT(*) AS num FROM Graphics GROUP BY Organization_ID
) orgcount ON People.Organization_ID = orgcount.num
ORDER BY
CASE WHEN Sent IS NULL AND orgcount.num = 0 THEN 0 ELSE 1 END,
orgcount.num DESC
答案 1 :(得分:0)
您可以使用Graphics表的外部联接来获取排序所需的数据。
由于我不知道您的架构,我假设People表有一个名为ID的主键列。如果PK列具有不同的名称,则应将其替换为GROUP BY
子句中的。
这样的事情对你有用:
SELECT People.*, (count(Distinct Graphics.Organization_ID) > 0) as Status
FROM People
LEFT OUTER JOIN Graphics ON People.Organization_ID = Graphics.Organization_ID
GROUP BY People.ID
ORDER BY Status ASC
答案 2 :(得分:0)
使用LEFT JOIN相当直接,前提是您在People表格中有某种主键到GROUP;
SELECT p.*, sent IS NOT NULL or COUNT(g.Organization_ID) Status
FROM People p LEFT JOIN Graphics g ON g.Organization_ID = p.Organization_ID
GROUP BY p.primary_key
ORDER BY Status
演示here。