这个简单的SQL查询有什么问题?它返回0行

时间:2015-03-17 10:47:17

标签: mysql sql

新手问题,请原谅我的无知:P

我有一个包含不同列的数据集。测验,姓名,成绩。有些学生没有完成所有测验。我只想要那些进行8次测验的人。我把这段代码:

SELECT *  FROM quiz_attempts 
WHERE qname like "onlinelernen_quiz_1" 
AND qname like "onlinelernen_quiz_2" 
AND qname like "onlinelernen_quiz_3" 
AND qname like "onlinelernen_quiz_4" 
AND qname like "onlinelernen_quiz_5" 
AND qname like "onlinelernen_quiz_6"
AND qname like "onlinelernen_quiz_7" 
AND qname like "onlinelernen_quiz_8"*/

使用INOR正在运行,但它会显示所有进行过测验的学生。但我想要只有那些完成所有8个测验的学生

感谢您的帮助。

8 个答案:

答案 0 :(得分:2)

当所有条件匹配时,

AND给出特定结果。使用OR

SELECT 
  * 
FROM
  quiz_attempts 
WHERE qname LIKE "onlinelernen_quiz_1" 
  OR qname LIKE "onlinelernen_quiz_2" 
  OR qname LIKE "onlinelernen_quiz_3" 
  OR qname LIKE "onlinelernen_quiz_4" 
  OR qname LIKE "onlinelernen_quiz_5" 
  OR qname LIKE "onlinelernen_quiz_6" 
  OR qname LIKE "onlinelernen_quiz_7" 
  OR qname LIKE "onlinelernen_quiz_8" 

答案 1 :(得分:2)

一列(例如qname)不可能在一行中采用多个值。我认为您的意思是or而不是and。但是,编写此查询的更好方法是使用in

SELECT *
FROM quiz_attempts
WHERE qname in ('onlinelernen_quiz_1', 'onlinelernen_quiz_2', 
                'onlinelernen_quiz_3', 'onlinelernen_quiz_4', 
                'onlinelernen_quiz_5', 'onlinelernen_quiz_6', 
                'onlinelernen_quiz_7', 'onlinelernen_quiz_8'
               )

编辑:

如果您希望学生参加所有8个测验,请使用聚合:

SELECT studentid
FROM quiz_attempts
WHERE qname in ('onlinelernen_quiz_1', 'onlinelernen_quiz_2', 
                'onlinelernen_quiz_3', 'onlinelernen_quiz_4', 
                'onlinelernen_quiz_5', 'onlinelernen_quiz_6', 
                'onlinelernen_quiz_7', 'onlinelernen_quiz_8'
               )
GROUP BY studentid
HAVING COUNT(DISTINCT qname) = 8;

答案 2 :(得分:2)

select studentID, count(*) as attempts
from quiz_attempts 
group by studentID
having  attempts=8

这会返回学生ID,假设您有一个为每次尝试保留学生ID的列。

答案 3 :(得分:1)

每当学生进行下一次测验时,您似乎正在将测验字符串附加到同一列。

如果是,请尝试使用此查询,

SELECT *  FROM quiz_attempts 
WHERE qname like "%onlinelernen_quiz_1%" 
AND qname like "%onlinelernen_quiz_2%" 
AND qname like "%onlinelernen_quiz_3%" 
AND qname like "%onlinelernen_quiz_4%" 
AND qname like "%onlinelernen_quiz_5%" 
AND qname like "%onlinelernen_quiz_6%"
AND qname like "%onlinelernen_quiz_7%" 
AND qname like "%onlinelernen_quiz_8%"

希望它有效,谢谢。

答案 4 :(得分:1)

您的查询无效,因为您要求qname的所有记录都是“onlinelernen_quiz_1”,而同时,例如“onlinelernen_quiz_2”,3 ......,这是不可能的。< / p>

试试这个:它只显示名字出现8次与onlinelernen测验相关的学生姓名

SELECT Q.stname
FROM quiz_attempts AS Q
WHERE Q.qname Like 'onlinelernen_quiz_%'
GROUP BY Q.stname
HAVING Count(Q.stname)=8;
祝你好运!

答案 5 :(得分:0)

试试这个。

SELECT Q.*
FROM   quiz_attempts

q            INNER JOIN(选择'onlinelernen_quiz_1'作为qname UNION                        选择'onlinelernen_quiz_2'UNION                        选择'onlinelernen_quiz_3'UNION                        选择'onlinelernen_quiz_4'UNION                        选择'onlinelernen_quiz_5'UNION                        选择'onlinelernen_quiz_6'UNION                        选择'onlinelernen_quiz_7'UNION                        选择'onlinelernen_quiz_8')C                    ON c.qname = q.qname

答案 6 :(得分:0)

如果您在student-qname字段上有PK,则可以计算按学生分组的行数。 像这样:

SELECT student_name,
       SUM(qname) AS total_quiz
FROM quiz_attempts
GROUP BY student_name
HAVING total_quiz = 8

答案 7 :(得分:0)

要抓住那些所有 8个测验的学生,这很烦人但可能会做类似的事情

SELECT * FROM quiz_attempts q1
WHERE qname like "onlinelernen_quiz_1"
INNER JOIN (
    SELECT * FROM quiz_attempts q2 
    WHERE qname like "onlinelernen_quiz_2"
) ON q1.student_id = q2.student_id
INNER JOIN (
    SELECT * FROM quiz_attempts q3 
    WHERE qname like "onlinelernen_quiz_3"
) ON q2.student_id = q3.student_id

等等。