2010-11-29 3 views
2

質問と回答の2つのテーブルがあり、多対多のリレーションテーブル、QuestionsAnswersがあります。質問には並べ替えの列があり、ユーザーに表示する方法を制御できます。また、QuestionAnswersにはソート列があり、質問ごとに回答の順序を制御できます。私の問題は、すべての質問とその回答を最初に質問し、次に質問を並べ替え、次に質問を並べ替えることを選択するSQLクエリを作成しようとしていることです。両方のソート列はNULL可能であり、これらの列の整数はNULLよりも優先すべきです。SQLオーダーオーダーBy

私はOrder Questions Byを得ることができます。正常に動作するようになりましたが、一度二番目のソート列に追加すると、うまくいかなくなります。たとえば、質問にSort = 0という意味があり、表示される最初の質問であるが、Answersに対する優先順位がない場合、QuestionsSort = nullおよびQuestionsAnswers.Sort = 0のQuestionAnswers行の下に注文されます。

これがうまくいく場合のヒントや考えは素晴らしいと思います。

編集:私はこのような何かが、トリックを行う必要が見ることができるものから、

SELECT 
    Q.Id AS QuestionId, 
    Q.Name AS Question, 
    A.Id AS AnswerId, 
    A.Text AS Answer 
FROM 
    dbo.Questions AS Q 
INNER JOIN 
    dbo.QuestionsAnswers AS QA 
     ON Q.Id = QA.QuestionId 
INNER JOIN 
    dbo.Answers AS A 
     ON QA.AnswerId = A.Id 
ORDER BY 
    ISNUMERIC(Q.Sort) DESC, 
    Q.Sort, 
    Q.Id, 
    A.Text; 
+0

実際のSELECTステートメントを共有し、問題を説明するだけの十分な数の行を返します。 – Narveson

+0

'ORDER BY 'は複数のコンマ区切りの列名を受け入れます。 – Powerlord

+0

ええ、私の問題は、いずれかの列がnullになる可能性があるため、並べ替えで互いにジャンプすることです。 QuestionsSortで完全にソートし、各サブグループ内でQuestionsAnswers.Sortでソートしたい。 – rpf3

答えて

5
ORDER BY COALESCE(Questions.Sort, 999999999), COALESCE(Answers.Sort, 999999999) 
+0

ありがとう、これは動作しますが、それは少しハッキーのようです。現実的にはソート値が高くなることは決してないでしょうし、ユーザーがソート列を入力するために入力できるものを制限することさえできますが、何らかの理由でそれを使用しても汚い感じがします。 – rpf3

+0

@ rpf3:合意しましたが、それは(コンピュータサイエンスとは対照的に)工学の本質です。時には、漏れがチューインガムで口に塞がれていることがあります。また、技術的に「正しい」解決策であると考えるかもしれません。「Questions.SortがNULLの場合は1を返します。質問をソートするときは」「Answers.SortがNULLの場合は1を返します」「Answers.Sort'」ハックよりもハッキリに見える。 –

2

。私が何かを見逃していない限り。

select questions.*, answers.* 
from questionsanswers qa 
inner join questions 
    on questions.idquestions = qa.questionid 
inner join answers 
    on answers.idanswers = qa.answerid 
order by isnull(questions.sort), questions.sort, isnull(qa.sort), qa.sort