2012-02-27 56 views
0

我正在尝试创建一个自定义排序,该排序涉及另一个表中某些记录的计数。例如,如果一个记录在另一个表中没有与其关联的记录,则它应该在排序中看起来高于具有一个或多个记录的记录。这是我到目前为止: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内的子查询不起作用。什么是这样做的正确方法?

更新:我感动case语句到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

这里有什么问题? – AndreKR 2012-02-27 18:44:05

回答

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 
0

你可以使用一个外部连接的图形表获取你的排序所需的数据。

因为我不知道你的模式,所以我假定People表有一个名为ID的主键列。如果PK栏的名称不同,则应替换GROUP BY子句中的名称。与JOIN只要你有某种在人民表,以集团的主键的左

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 
0

相当直截了当;:

像这样的东西应该为你工作

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