2016-02-23 7 views
6

Ich möchte etwas Hilfe mit dieser MySQL-Abfrage. Im Idealfall würde ich es mit der node.js Sequelize ORM generieren.MySQL beitreten, ORDER BY RAND() dann sortieren ASC ASC (vorzugsweise mit Sequelize)

Die Tische sind:

Questions: id, question 
Answers: id, question_id, answer 

Mein Sequelize Code ist: in

SELECT `questions`.`id`, 
     `questions`.`question`, 
     `answers`.`id`   AS `answers.id`, 
     `answers`.`question_id` AS `answers.question_id`, 
     `answers`.`answer`  AS `answers.answer` 
FROM `questions` AS `questions` 
     LEFT OUTER JOIN `answers` AS `answers` 
        ON `questions`.`id` = `answers`.`question_id` 
WHERE `questions`.`id` NOT IN (-1) 
ORDER BY `questions`.`id` ASC, 
      `answers`.`id` ASC 

und Ergebnisse:

models.questions.findAll({ 
    where: { 
    id: { 
     $notIn: not_in 
    } 
    }, 
    order: [['id','ASC'], [models.answers, 'id', 'ASC']], 
    attributes: ['id', 'question'], 
    include: [{ 
     model: models.answers, 
     attributes: ['id', 'question_id', 'answer'], 
    }] 
}) 

Mit not_in Set -1, Sequelize diese Abfrage generiert

id | question | answers.id | answers.question_id | answers.answer 
13 | first question | 17 | 13 | 1st answer 
13 | first question | 23 | 13 | 2nd answer 
13 | first question | 24 | 13 | 3rd answer 
14 | second question | 18 | 14 | 1st answer 
14 | second question | 21 | 14 | 2nd answer 
14 | second question | 22 | 14 | 3rd answer 
15 | third question | 19 | 15 | 1st answer 
15 | third question | 20 | 15 | 2nd answer 

Ich möchte dieses Ergebnis, aber mit der Frage zufällig sortiert.

Also statt 13, 14 dann 15, könnte es 14, 15, 13 sein, aber mit Antworten immer noch mit ihrer Frage ausgerichtet und nach answers.id sortiert.

Würde alle Zeiger für die Sequelize-Code oder MySQL-Abfrage, um ein solches Ergebnis zu erhalten. Vielen Dank!

Ich habe versucht, ORDER BY RAND() an verschiedenen Orten, aber es endet am Mischen der Antworten auch.

P.S. Als Nebenwirkung, früher musste ich dies mit nahm nur eine Frage, für welche zufällig, ich verwendet:

SELECT `questions`.`id`  AS `question_id`, 
     `questions`.`question` AS `question`, 
     `answers`.`id`   AS `answer_id`, 
     `answers`.`answer`  AS `answer` 
FROM (SELECT `questions`.`id`, 
       `questions`.`question` 
     FROM `questions` AS `questions` 
     WHERE (SELECT `question_id` 
       FROM `answers` AS `answers` 
       WHERE `questions`.`id` = `answers`.`question_id` 
         AND questions.id NOT IN (-1) 
       LIMIT 1) IS NOT NULL 
     ORDER BY RAND() 
     LIMIT 1) AS `questions` 
     INNER JOIN `answers` AS `answers` 
       ON `questions`.`id` = `answers`.`question_id` 
ORDER BY `answers`.`question_id`, 
      `answers`.`id` 

Welche zurückkehren würde, zum Beispiel:

id | question | answers.id | answers.question_id | answers.answer 
14 | second question | 18 | 14 | 1st answer 
14 | second question | 21 | 14 | 2nd answer 
14 | second question | 22 | 14 | 3rd answer 
+0

Momentan nicht möglich - Sie könnten jedoch 'include.separate' verwenden, wodurch zwei separate Abfragen ausgeführt werden https://github.com/sequelize/sequelize/issues/4875 –

Antwort

1

Im Klar MySQL:

SELECT ... 
    FROM 
     (SELECT RAND() AS rnd, id FROM questions) AS r 
    JOIN questions AS q ON q.id = r.id 
    JOIN answers AS a ON a.question_id = q.id 
    ORDER BY r.rnd, a.id 
Verwandte Themen