2010-09-20 118 views
2

我有属性,我需要先列出映射为“创建成员”的那些,然后按字母顺序排列,而其余的则不需要随后出现并按字母顺序列出。ORDER BY GROUP_CONCAT是否包含某个值?

properties table: 
------------------------ 
id name 
1 Gaga Hotel 
2 Foo Bar Resort 


properties_features 
------------------------ 

feature_id property_id 
1   1 
2   1 
2   2 

features 
------------------------ 
id name 
1 Founding Member 
2 Glamping 

目前我做的:

SELECT 
p.name, 
GROUP_CONCAT(pf.feature_id) AS features 

FROM properties AS p 

LEFT JOIN properties_features AS pf 
    ON p.id = pf.property_id 

WHERE 1=1 

GROUP BY p.id 

但基于是否features又名GROUP_CONCAT (pf.feature_id)包含1这是“创始会员”这显然不会为了他们。

我该怎么做?噢,我无法真正改变模式,因为我正在对现有网站进行编辑,因此我不得不调整整个网站。

回答

2

也许:

SELECT 
p.name, 
GROUP_CONCAT(pf.feature_id) AS features 

FROM properties AS p 

LEFT JOIN properties_features AS pf 
    ON p.id = pf.property_id 

WHERE 1=1 

GROUP BY p.id 

ORDER BY 
    CASE WHEN LOCATE(',1,', CONCAT(',', features, ',')) <> 0 THEN 1 ELSE 2 END, 
    p.name 
1

如果您需要在列表功能进行排序,你可以设置ORDER BYGROUP_CONCAT

SELECT 
    p.name, GROUP_CONCAT(pf.feature_id ORDER BY 
    CASE 
    WHEN ft.name = `Founding Member` THEN '' 
    ELSE ft.name 
    END) AS features 
    FROM properties p 
    LEFT JOIN properties_features AS pf 
    ON p.id = pf.property_id 
    LEFT JOIN features ft ON (ft.id = pf.features) 
    GROUP BY p.id 

如果您需要根据是否feature.name输出排序是创始成员之一, 你可以做

SELECT 
p.name, GROUP_CONCAT(pf.feature_id) AS features, MIN(
CASE 
    WHEN ft.name = `Founding Member` THEN 0 
    ELSE 1 
    END 
) AS order_field 
FROM properties p 
LEFT JOIN properties_features AS pf 
ON p.id = pf.property_id 
LEFT JOIN features ft ON (ft.id = pf.features) 
GROUP BY p.id 
ORDER BY order_field