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

しかし、これは明らかに、「創設メンバー」であるfeatures別名GROUP_CONCAT ( pf.feature_id )が含まれているかどうかに基づいてそれらを並べ替えません。1

どうすればこれを行うことができますか? ああ、既存のサイトを編集しているので、Web サイト全体をほとんど調整する必要があるため、スキーマを実際に変更することはできません。

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 が創設メンバーであるかどうかに基づいて出力を並べ替える必要がある場合は、次のことができます。

 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 に答える