ORDER BY, содержит ли GROUP_CONCAT определенное значение? - PullRequest
2 голосов
/ 20 сентября 2010

У меня есть свойства, и мне нужно сначала перечислить те, которые отображаются как «Участники-основатели», а затем в алфавитном порядке, а остальные, которые не обязательно должны появляться позже и быть перечислены в алфавитном порядке.

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 aka GROUP_CONCAT ( pf.feature_id ) 1, который является "Основателем".

Как я мог это сделать? Да, я не могу изменить схему, так как мне пришлось бы в значительной степени настроить весь сайт, так как я вносил изменения в существующий сайт.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Возможно:

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 голос
/ 20 сентября 2010

Если вам нужно отсортировать объекты в списке, вы можете установить 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 членом-основателем,Вы можете сделать

 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
...