2

我有属性,我需要首先列出映射为“创始成员”的属性,然后按字母顺序列出,而其余不需要的则按字母顺序列出。

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

但这显然不会根据featuresaka是否GROUP_CONCAT ( pf.feature_id )包含1“创始成员”来订购它们。

我怎么能这样做?哦,我无法真正更改架构,因为在对现有网站进行编辑时,我必须调整几乎整个网站。

4

2 回答 2

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
于 2010-09-20T16:37:44.890 回答
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
于 2010-09-20T16:39:08.567 回答