MySQL使用子查询评估案例

时间:2012-02-27 18:40:50

标签: mysql

我正在尝试创建一个涉及另一个表中某些记录计数的自定义排序。例如,如果一个记录在另一个表中没有与之关联的记录,则它应该在排序中显得高于具有一个或多个记录的记录。这是我到目前为止所做的:

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将为空。这实现了迫切需要。

3 个答案:

答案 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