如何将 WHERE 用于多个不同的列?

How can I use WHERE with multiple different columns?

在 SQlite3 语句中尝试查询 AND 和 OR 时遇到问题。

有什么方法可以让我做类似的事情

WHERE section = ? AND LEVEL =? AND subj1 =? AND subj2=? AND subj3 =?

根据我在这一行中看到的内容

SELECT * FROM students WHERE section = ? AND level =? AND subj1 = ? OR subj2 = ? OR subj3 =?

它不会工作,因为在 'AND subj1 =?' 之后,SQlite3 现在选择 select subj2 和 subj3 的任何主题,完全忽略部分和级别列。 如何获得与我想要的部分、级别和主题相匹配的行?

这是我的代码

query = ("""SELECT * FROM students WHERE section = ? AND level =? AND subj1 = ? OR subj2 = ? OR subj3 =?"""
c.execute(query, (variable1, variable2, variable3, variable4, variable5, ))
rows = c.fetchall()
print (rows)   

这是一个示例 table

Name        Section       Level        Subject 1       Subject 2      Subject 3

John    |      1      |     1      |      Math     |    Science    |    English
Mary    |      1      |     1      |      Math     |    Science    |    English
Dave    |      2      |     2      |      English  |    History    |    Math 
Joe     |      2      |     2      |      English  |    History    |    Math
        

使用括号:

WHERE section = ? AND level =? AND
      (subj1 = ? OR subj2 = ? OR subj3 = ?)

假设最后三个参数相同,您可以使用 IN 简化此操作:

WHERE section = ? AND level =? AND
      ? IN (subj1, subj2, subj3)

通常 ININ 列表中有常量,列名作为左操作数。但是,这不是必需的。

OR 的逻辑优先级低于 AND。要执行您想要的操作,您需要用括号将 ORed 谓词括起来:

SELECT * 
FROM students 
WHERE section = ? AND level = ? AND (subj1 = ? OR subj2 = ? OR subj3 =?)

不过,这里用起来更简单 IN:

SELECT * 
FROM students 
WHERE section = ? AND level = ? AND ? IN (subj1, subj2, subj3)