【问题标题】:MySQL nested ANDs and several conditionsMySQL 嵌套 AND 和几个条件
【发布时间】:2013-08-27 11:11:52
【问题描述】:

我有两张表用于多项选择问卷(每个用户回答一系列问题):

users (userID, name, email)

votes (voteID, userID, questionID, answerID)

样本数据(用户):

0, Some Name, some@thing.com
1, Other Name, some@one.com

样本数据(投票):

0, 1, 1, 1
1, 1, 2, 2
2, 1, 3, 2

我想选择所有回答正确的用户。

我试过这个(我已经硬编码了答案):

$sql = "SELECT users.userID, users.name, users.email FROM users
INNER JOIN votes ON (users.userID = votes.userID)
WHERE (votes.questionID = '1' AND votes.answerID = '1')
AND (votes.questionID = '2' AND votes.answerID = '2')
AND (votes.questionID = '3' AND votes.answerID = '2')
AND (votes.questionID = '4' AND votes.answerID = '3')
AND (votes.questionID = '5' AND votes.answerID = '1')
GROUP BY users.userID";

但这不会返回任何东西。

我也尝试过这样的事情(我还硬编码了答案):

$sql = "SELECT users.userID, users.name, users.email FROM users
INNER JOIN transfertipsvotes ON (users.userID = transfertipsvotes.userID)
WHERE (transfertipsvotes.questionID = '1' AND transfertipsvotes.answerID = '1') GROUP BY users.userID
UNION
SELECT users.userID, users.name, users.email FROM users
INNER JOIN transfertipsvotes ON (users.userID = transfertipsvotes.userID)
WHERE (transfertipsvotes.questionID = '2' AND transfertipsvotes.answerID = '2') GROUP BY users.userID
UNION
SELECT users.userID, users.name, users.email FROM users
INNER JOIN transfertipsvotes ON (users.userID = transfertipsvotes.userID)
WHERE (transfertipsvotes.questionID = '3' AND transfertipsvotes.answerID = '2') GROUP BY users.userID";

但这只会返回一个正确答案的所有用户。

如何进行正确的查询以选择所有回答正确的用户?

【问题讨论】:

  • 哪一栏显示答案是否正确?以及如何?
  • 我正在打印 users.userID、users.name 和 users.email。

标签: mysql select pdo


【解决方案1】:

据我现在所见,您需要为每个问题使用 INNER JOIN,因此每个内部连接将如下所示:

INNER JOIN votes AS q1 ON (users.userID = q1.userID) AND q1.questionID = '1' AND q1.answerID ='1'

对每个问题重复此操作,您可以检查它。

【讨论】:

  • 这可能适用于一两个内部联接,但如果达到三个或更多,则需要很长时间并最终超时。
【解决方案2】:

如果我对您的理解正确,您希望回答所有问题的用户都正确。在这种情况下,您应该使用 INTERSECT 而不是 UNION

但是,为此,您提出的问题与您提出的问题一样多。最好在 where "((question1 and Answer1) or (question2 and Answer2))" 中使用 OR 子句。最后根据用户 ID 做一个分组,计算正确答案的数量,只获取所有正确答案的成员。

【讨论】:

  • 您对我的意图是正确的 - 但它不适用于 INTERSECT 而不是 UNION。我更喜欢您的第二个建议,但我不太清楚查询的外观。
  • select * from users where userid in (select userid from qusetions where (qusetion1 and answer1) or (qusetion2 and answer2) or .. group by userid with count(qusetionid) = )跨度>
  • 感谢您的尝试,Mani,但我无法让您的查询正常工作 - 我用正确的表格重新编写了它,但仍然没有。
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多