2010-09-20 3 views
2

J'ai des propriétés et je dois d'abord lister celles qui sont mappées en tant que "Membres Fondateurs", puis alphabétiquement alors que les autres qui n'ont pas besoin de venir après sont listées par ordre alphabétique.ORDONNER PAR si un GROUP_CONCAT contient une certaine valeur?

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 

Actuellement, je fais:

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 

Mais ce ne sera évidemment pas les commander selon que features alias GROUP_CONCAT (pf.feature_id) contient 1 qui est « membre fondateur ».

Comment est-ce que je pourrais faire ceci? Oh, et je ne peux pas vraiment changer le schéma car je devrais ajuster à peu près tout le site Web pendant que j'effectue des modifications sur un site existant.

Répondre

2

Peut-être:

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

Si vous devez trier les caractéristiques dans la liste, vous pouvez définir ORDER BY à l'intérieur 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 

Si vous devez trier la sortie selon que feature.name est membre fondateur, vous pouvez le faire

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 
Questions connexes