2011-10-24 40 views
1

我有两个表,建立和分支。建立是父表。当我选择分支机构列表时,如果分支标题为空,我希望它检索机构名称。另外,我只想为每个机构显示一个分支。这是我想出的:ORDER BY与GROUP BY不能按预期工作

SELECT 
    branch.id 
    , branch.establishment_ID 
    , IFNULL(branch.branch_title, establishment.name) AS branch_title 
FROM branch 
LEFT JOIN establishment ON branch.establishment_ID = establishment.id 
WHERE cityID = 2 
GROUP BY establishment_ID 
ORDER BY branch_title 

但是,结果似乎没有任何特定的顺序。我希望他们按字母顺序排列。我读过MySQL 5.0.5在同一查询中遇到GROUP BY和ORDER BY的问题,但我正在使用5.5.9。我能做些什么来解决这个问题?

+1

该组是由不确定的。这是你的问题,整个查询没有意义,因此它混合来自不相关行的数据。 – Johan

+0

您对branch.id和establish_id没有使用任何聚合函数。当有多个建立群体或分支标识时,您需要提供一个聚合函数(例如,最大值)来确定在分组时选择哪些。 – macleojw

+0

你正在选择3,非聚合,branch.id,branch.establishment_ID,branch_title,但只是其中之一(这是无效的,虽然MySQL不抱怨)分组。你应该由他们所有的3人组成。 – nos

回答

1

我猜(知道其他SQL系统),您的ORDER BY正在应用于branch.branch_title,而不是您的新别名。您有能力复制您的IFNULL()表达式到ORDER BY

SELECT 
    branch.id 
    , branch.establishment_ID 
    , IFNULL(branch.branch_title, establishment.name) AS branch_title 
FROM branch 
LEFT JOIN establishment ON branch.establishment_ID = establishment.id 
WHERE cityID = 2 
GROUP BY establishment_ID 
ORDER BY IFNULL(branch.branch_title, establishment.name) 

否则,NULL branch_title行总是会出现(前/后)非NULL的,并且不会以任何方式进行排序。

+0

是的,使用表达式不是别名,因为它是不明确的 – gbn

+0

只需编写ORDER BY 3来使用输出列3的值。更好的是,为计算出来的'branch_title'使用**不同的名称**来避免这种情况错误。顺便说一句,“GROUP BY establishment_ID”的另一个潜在问题。也可以是ambiguos。特别是当你有一个'LEFT JOIN'时。限定名称('branch.establishment_ID')或替代“GROUP BY 2”。 –