【问题标题】:Combining Rows in SELECT Case Statement在 SELECT Case 语句中组合行
【发布时间】:2018-05-10 01:05:12
【问题描述】:

我有这个问题

SELECT questions.question_id, 
       questions.question, 
       questions.answer_id, 
       nlp_terms.word,
       ( CASE 
           WHEN answers.id = questions.answer_id THEN answers.answer 
         END ) AS answer, 
       ( CASE 
           WHEN answers.id != questions.answer_id THEN answers.answer 
         END ) AS incorrect_answer_1, 
       ( CASE 
           WHEN answers.id != questions.answer_id THEN answers.answer 
         END ) AS incorrect_answer_2 
FROM   questions 
       JOIN answers 
         ON answers.question_id = questions.question_id 
       JOIN nlp_terms 
         ON questions.question_id = nlp_terms.question_id
WHERE questions.question_id = '1'

此查询输出:

╔═════════════╦═══════════════════════════════════════════╦═══════════╦═══════════╦════════╦════════════════════╦════════════════════╗
║ question_id ║                 question                  ║ answer_id ║   word    ║ answer ║ incorrect_answer_1 ║ incorrect_answer_2 ║
╠═════════════╬═══════════════════════════════════════════╬═══════════╬═══════════╬════════╬════════════════════╬════════════════════╣
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ What      ║ NULL   ║ South America      ║ South America      ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ continent ║ NULL   ║ South America      ║ South America      ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ is        ║ NULL   ║ South America      ║ South America      ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ the       ║ NULL   ║ South America      ║ South America      ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ country   ║ NULL   ║ South America      ║ South America      ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ Lesotho   ║ NULL   ║ South America      ║ South America      ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ in?       ║ NULL   ║ South America      ║ South America      ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ What      ║ Africa ║ NULL               ║ NULL               ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ continent ║ Africa ║ NULL               ║ NULL               ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ is        ║ Africa ║ NULL               ║ NULL               ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ the       ║ Africa ║ NULL               ║ NULL               ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ country   ║ Africa ║ NULL               ║ NULL               ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ Lesotho   ║ Africa ║ NULL               ║ NULL               ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ in?       ║ Africa ║ NULL               ║ NULL               ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ What      ║ NULL   ║ Australia          ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ continent ║ NULL   ║ Australia          ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ is        ║ NULL   ║ Australia          ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ the       ║ NULL   ║ Australia          ║ AustraliA          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ country   ║ NULL   ║ Australia          ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ Lesotho   ║ NULL   ║ Australia          ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ in?       ║ NULL   ║ Australia          ║ Australia          ║
╚═════════════╩═══════════════════════════════════════════╩═══════════╩═══════════╩════════╩════════════════════╩════════════════════╝

如您所见,它引入了我想要的所有数据,只是我的 CASE 语句采用了自己的一行而不是分组。

我有很多 GROUP BY 操作,但无法让它像我预期的输出:

╔═════════════╦═══════════════════════════════════════════╦═══════════╦═══════════╦════════╦════════════════════╦════════════════════╗
║ question_id ║                 question                  ║ answer_id ║   word    ║ answer ║ incorrect_answer_1 ║ incorrect_answer_2 ║
╠═════════════╬═══════════════════════════════════════════╬═══════════╬═══════════╬════════╬════════════════════╬════════════════════╣
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ What      ║ Africa ║ South America      ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ continent ║ Africa ║ South America      ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ is        ║ Africa ║ South America      ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ the       ║ Africa ║ South America      ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ country   ║ Africa ║ South America      ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ Lesotho   ║ Africa ║ South America      ║ Australia          ║
║        1369 ║ What continent is the country Lesotho in? ║      4106 ║ in?       ║ Africa ║ South America      ║ Australia          ║
╚═════════════╩═══════════════════════════════════════════╩═══════════╩═══════════╩════════╩════════════════════╩════════════════════╝

为了获得预期的输出,我缺少什么?

【问题讨论】:

  • 你所有的问题都只有 3 个答案吗?
  • 现在,是的,所有问题都有 3 个答案。

标签: mysql sql join case


【解决方案1】:

我认为这会产生您想要的结果:

SELECT q.question_id, q.question, q.answer_id, t.word,
       MAX(CASE WHEN a.id = q.answer_id THEN a.answer 
           END) AS answer, 
       MAX(CASE WHEN a.id <> q.answer_id THEN a.answer 
           END) AS incorrect_answer_1, 
       MIN(CASE WHEN a.id <> q.answer_id THEN a.answer 
           END) AS incorrect_answer_2 
FROM questions q JOIN
     answers a
     ON a.question_id = q.question_id JOIN
     nlp_terms t
     ON q.question_id = t.question_id
WHERE q.question_id = 1
GROUP BY q.question_id, q.question, q.answer_id, t.word;

【讨论】:

  • 是的!爱你谢谢。已编辑 MIN(CASE WHEN q.id 应为 MIN(CASE WHEN q.question_id
  • 假设我必须引入nlp_terms.id auto_increment (t.id) 以确保单词的顺序也正确?添加时效果很好,因为上面的答案查询按t.word 字母顺序排序
  • 您实际上在我面前发现了它(我的意思是并不奇怪 :) 但我没有重新阅读整个更新以注意到)- 更深入地研究它 MIN(CASE 我之前评论过的应该根本不引用表 q,实际上在所有 CASE 语句中应该是 a.idq.question_id。如前所述,上面的查询带有包含的GROUP BYt.id,并以t.id 输出的ORDER 结束查询,效果很好。再次感谢您分享您对此的知识和见解
【解决方案2】:

您是否尝试过“WHERE questions.question_id = '1' AND answer IS NOT NULL”

参考:http://www.dofactory.com/sql/where-isnull

【讨论】:

  • 同样的结果。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2014-12-05
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多