[英]What is wrong with this simple sql query? it returns 0 rows
新手问题,请原谅我的无知: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"*/
使用IN
或OR
可以正常工作,但它会显示所有参加测验的学生。 但是我只想要那些完成了所有8个测验的学生 。
谢谢您的帮助。
当所有条件匹配时,AND给出特定的结果。 使用或
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"
一列(例如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;
select studentID, count(*) as attempts
from quiz_attempts
group by studentID
having attempts=8
假设您有一列为每次尝试保留学生ID的列,这将返回学生ID。
似乎每次学生进行下一个测验时,您都将测验字符串附加到同一列。
如果是这样,请尝试使用此查询,
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%"
希望它能工作,谢谢。
您的查询无法进行,因为您要查询所有qname类似于“ onlinelernen_quiz_1”的记录, 同时又查询诸如“ onlinelernen_quiz_2” 3等的记录,这是不可能的。
试试这个:它仅显示出现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;
祝好运!
尝试这个。
SELECT Q.*
FROM quiz_attempts
q INNER JOIN(SELECT'onlinelernen_quiz_1'作为qname UNION SELECT'onlinelernen_quiz_2'UNION SELECT'onlinelernen_quiz_3'UNION SELECT'onlinelernen_quiz_4'UNION SELECT'onlinelernen_quiz_5'UNION SELECT'onlinelernen_qui__C_7'onlinelernen_qui__ qname = q.qname
如果您在student-qname字段上有一个PK,则可以计算按student分组的行。 像这样:
SELECT student_name,
SUM(qname) AS total_quiz
FROM quiz_attempts
GROUP BY student_name
HAVING total_quiz = 8
赶上所有 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
等等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.