2017-04-08 31 views
1

条件我有试题库表,我想提取问题根据不同的条件,其中诸如如何查询不同,其中在同一个表中,并接合结果

(SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD , CorrectAnswer, marks 
FROM questionbank 
WHERE Department = "DCP" 
and Subject = "CO" 
and Unit = "1" 
and marks = "1" LIMIT 3) 
UNION (SELECT unit,Subject,Question,OptionA ,OptionB ,OptionC ,OptionD ,CorrectAnswer,marks 
FROM questionbank 
WHERE Department ="DCP" 
and Subject="CO" 
and Unit="1" 
and marks ="2" LIMIT 1) 

我有6个单位和标记是1,2, 3或4.限制由用户指定。 这将是传统工会方式中的安静大查询。如何以简单和简单的方式做到这一点?

在此查询中,只有unit(1to6),marks(1to4)和limit是可变的。

+1

你的问题是什么?你的查询看起来很好。 –

+0

我刚刚写了一个单位的查询和标记= 1,我有6个这样的单位和标记1,2,3,4。如何将所有这些结合在一起? ,使用联合会使这个查询非常大,这又是另一种有效的方法吗? –

+0

部门和主题是否因不同的单位和标记而有所不同?或者Department =“DCP”和Subject =“CO”'子句是常量? – ghostprgmr

回答

0

没有数据的例子很难理解最终的目标,但我想下面的变种之一是有用的。

使用IN操作

,如果各部门和主题是恒定值,你可以使用IN操作:

SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD, CorrectAnswer, marks 
FROM questionbank 
WHERE Department = "DCP" and Subject = "CO" and Unit IN ("1", "2", "3", "4", "5", "6") and marks IN ("1", "2", "3", "4") 

不同的部门和主题

SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD, CorrectAnswer, marks 
FROM questionbank 
WHERE 
    (Department = "DCP" and Subject = "CO" and Unit = "1" and marks = "1") 
    OR (Department = "XXX" and Subject = "YY" and Unit = "2" and marks = "3") 
    OR ... 

或者你可以使用其他一些方法t可能与上述两者中的一个类似。

首先,您需要自己决定这四个参数(部门,主题,单位和标记)如何相互关联。那么找到最佳解决方案会更容易。

更新:

对于每个标记不同的限制,我想这样的事情,可以用:

SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD, CorrectAnswer, marks 
    FROM questionbank 
    WHERE Department = "DCP" and Subject = "CO" and Unit IN ("1", "2", "3", "4", "5", "6") and marks = "1" 
    LIMIT 1 
UNION ALL  
SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD, CorrectAnswer, marks 
    FROM questionbank 
    WHERE Department = "DCP" and Subject = "CO" and Unit IN ("1", "2", "3", "4", "5", "6") and marks = "2" 
    LIMIT 2 
UNION ALL  
SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD, CorrectAnswer, marks 
    FROM questionbank 
    WHERE Department = "DCP" and Subject = "CO" and Unit IN ("1", "2", "3", "4", "5", "6") and marks = "3" 
    LIMIT 3 
UNION ALL  
SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD, CorrectAnswer, marks 
    FROM questionbank 
    WHERE Department = "DCP" and Subject = "CO" and Unit IN ("1", "2", "3", "4", "5", "6") and marks = "4" 
    LIMIT 4 

但是,我无法检查该变种现在的语法是否正确。

+0

很好的答案,让我明确,部门和主题是常见的,每个单元有4种类型的问题1,2,3,4标注的问题。他们每个人都有用户决定的限制。 –

+0

可以使用'Unit =“1”和Mark IN(“1”,“2”,“3”,“4”)'。但是,如果每个单元都有单独的限制,那么'UNION'可能是最佳解决方案。 – ghostprgmr

+0

是有1个标记有不同的限制... 4个标记问题 –

0

你的要求不明确的,但是你可以在你的whereor结合不同的可能的条件下,像

SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD , CorrectAnswer, marks 
FROM questionbank 
WHERE Department = "DCP" and Subject = "CO" and (
      (Unit = "1" and marks = "1") OR 
      (Unit = "2" and marks = "3") OR 
      /* ... */ 
      (Unit = "6" and marks = "4") 
     ) 
LIMIT 3 
+0

我必须从每个单元选择1个标记2个标记3个标记和4个标记问题,总共有6个单元,并且有限制选择1,2,4,4个标记问题。 –

0

与MySQL的伟大的事情是,它是非常灵活和IN子句可以运行甚至与多个表达式匹配。我无法找到有关我即将解释的功能的良好文档,但我会尽我所能简单说明。

所以通常IN子句是这样工作的:

SELECT 
column1,column2,... 
FROM 
table_name 
WHERE 
(expr|column_1) IN ('value1','value2',...); 

但是你可以修改IN子句表达尽可能多的表达式来工作,你想:

SELECT 
column1,column2,... 
FROM 
table_name 
WHERE 
((expr1|column_1),(expr2|column_2),..) IN (('value1','value2'), ('value3','value4')...); 

我有一个简单SQLFiddle示范这个。

所以要简单地回答你的问题,你可以像这样修改你的查询,以达到你想要的目的,而不会使用UNION过度查杀你的查询。

SELECT unit, Subject, Question, OptionA, OptionB, OptionC, OptionD , CorrectAnswer, marks 
FROM questionbank 
WHERE Department = "DCP" 
and Subject = "CO" 
and (Unit, marks) IN ((1,1), (1,2), (2,3), .. , (6,4)) 
LIMIT 3 

我总是在我的查询中使用它,但没有看到很多人使用它。我觉得这是处理WHERE条款中配对组合的最佳方法。

+0

哇,另一个非常翔实的答案。 @Neels –

+0

欢迎来到SO!乐于帮助! :) – Neels

相关问题