我有属性,我需要首先列出映射为“创始成员”的属性,然后按字母顺序列出,而其余的则不需要随后出现并按字母顺序列出。
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
是“创始成员”而对它们进行排序。
我怎么能这样做?哦,我无法真正改变架构,因为我正在对整个网站进行调整,因为我正在对现有网站进行编辑。
答案 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