2010-11-29 4 views
2

J'ai donc deux tables, Questions et Réponses, jointes par une table de plusieurs à plusieurs, QuestionsAnswers. Les questions ont une colonne Trier qui me permet de contrôler comment elles sont affichées à l'utilisateur, et QuestionsAnswers a également une colonne de tri qui me permet de contrôler l'ordre des réponses pour chaque question. Mon problème est que j'essaye d'écrire une requête SQL qui sélectionnera toutes les questions et leurs réponses commandées d'abord par Question.Sort puis par QuestionsAnswers.Sort. Les deux colonnes de tri sont nullables et les entiers de ces colonnes doivent avoir la priorité sur les valeurs nulles.Commande SQL par dans l'ordre Par

Je peux obtenir l'ordre par questions.Sort pour fonctionner correctement mais une fois que j'ajoute dans la deuxième colonne de tri, il va de travers. Par exemple, si une Question a un Sort = 0 signifiant qu'elle devrait être la première Question affichée mais n'a aucune préférence pour ses Réponses, elle sera ordonnée sous une ligne QuestionsAnswers qui a Questions.Sort = null et QuestionsAnswers.Sort = 0

Toutes les astuces ou réflexions si cela est encore possible serait géniale.

modifier:

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

Partagez votre instruction SELECT réelle et donnez un exemple des lignes qu'elle renvoie, juste ce qu'il faut pour illustrer le problème. – Narveson

+0

'ORDER BY' accepte plusieurs noms de colonne séparés par des virgules. – Powerlord

+0

ouais, mon problème est que puisque l'une des colonnes peut être nulle, ils vont sauter les uns sur les autres dans le tri. Je veux trier complètement par Questions.Sort et puis dans chaque tri de sous-groupes par QuestionsAnswers.Sort – rpf3

Répondre

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

Merci beaucoup, cela fonctionne, mais il semble que c'est un peu hacky. Je veux dire de manière réaliste, il n'y aura probablement jamais une valeur de tri aussi élevée et je peux même limiter ce que l'utilisateur peut saisir pour les colonnes de tri pour assurer cela, mais je me sens toujours sale en l'utilisant pour une raison quelconque. – rpf3

+0

@ rpf3: D'accord, mais c'est la nature de l'ingénierie (par opposition à l'informatique). Parfois, la fuite est mieux bouchée avec le chewing-gum dans la bouche. Vous pouvez également considérer que la solution techniquement "correcte", 'ORDRE PAR CASSET QUESTIONS.SORT EST NULL ALORS 1 ELSE 0 FIN, Questions.Sort, cas QUANDSONTS.SORT EST NULL ALORS 1 ELSE 0 FIN, Réponses.Sort', semble plus hackier que le hack. –

2

D'après ce que je peux voir quelque chose comme ça devrait faire l'affaire. À moins que je ne manque quelque chose.

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