1

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を選択したいだけです。とにかく確実に近づいてる…

4

1 に答える 1

2

たぶん、いつになるかtags.name = 'piano'を評価するからです。試してみてください。NULLtags.nameNULLCOALESCE(tags.name, '') = 'piano'

于 2010-04-13T11:43:51.557 に答える