新手问题,请原谅我的无知: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个测验的学生。
感谢您的帮助。
答案 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
等等。