ORDER BY GROUP_CONCAT是否包含某个值?

时间:2010-09-20 16:10:17

标签: sql 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 个答案:

答案 0 :(得分: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 :(得分:1)

如果您需要对列表中的功能进行排序,可以在ORDER BY内设置GROUP_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是否为Founding Member对输出进行排序, 你可以做到

 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