taggings と呼ばれる結合テーブルを介して、質問に多くのタグがあるとします。私はこうして参加します:
SELECT DISTINCT `questions`.id
FROM `questions`
LEFT OUTER JOIN `taggings`
ON `taggings`.taggable_id = `questions`.id
LEFT OUTER JOIN `tags`
ON `tags`.id = `taggings`.tag_id
'piano' などの特定のタグ名に従って結果を並べ替えたいので、ピアノが一番上に表示され、次に他のすべてのタグがアルファベット順に表示されます。現在、私はこの注文句を使用しています:
ORDER BY (tags.name = 'piano') desc, tags.name
これは完全に間違っています。最初に返された結果には、「ピアノ」のタグが付けられていません。私の問題は、タグ名を何らかの形でグループ化し、それに対して順序付けテストを行う必要があることだと思います。結果の結合テーブルの構造のために、まっすぐな tags.name に対してそれを実行しても機能しないと思います (機能します)タグテーブルで単純な選択を行うだけの場合)しかし、それを修正する方法がわかりません。
アドバイスありがとう、マックス
編集 - Marcelo re COALESCE に返信 Marcelo に感謝します。これは前に見たことがありませんでした。API をより適切に読み取る必要があります。これは実際には役立ちますが、合体節も選択した場合に限ります。つまり、これ:
SELECT DISTINCT `questions`.id
FROM `questions`
LEFT OUTER JOIN `taggings`
ON `taggings`.taggable_id = `questions`.id
LEFT OUTER JOIN `tags`
ON `tags`.id = `taggings`.tag_id
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name
それでも偽の結果が得られます。ただし、これは次のとおりです。
SELECT DISTINCT `questions`.id, COALESCE(tags.name,'')
FROM `questions`
LEFT OUTER JOIN `taggings`
ON `taggings`.taggable_id = `questions`.id
LEFT OUTER JOIN `tags`
ON `tags`.id = `taggings`.tag_id
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name
正しい結果を返します。ただし、質問IDを選択したいだけです。とにかく確実に近づいてる…