【问题标题】:SQL multiple Select ... where id in and a DISTINCTSQL 多个 Select ... where id in 和一个 DISTINCT
【发布时间】:2013-08-20 16:59:40
【问题描述】:

我正在对 MySQL 数据库中的一个表运行一个带有多个“where id in”子句的查询。我在每个查询中都放置了 DISTINCT 以尝试减少结果的数量。仍然锁定了我的 MySQL 表。任何我不知道的故障,还是我应该尝试摆脱一些 DISTICT?只有第一个 DISTINCT 是必需的。

   SELECT DISTINCT id, name 
   FROM TP_Test_Info 
   WHERE id IN (SELECT DISTINCT test_id 
                FROM TP_Test_Sections 
                WHERE id IN (SELECT DISTINCT section_id 
                             FROM TP_Test_Questions 
                             WHERE id IN (SELECT DISTINCT question_id 
                                          FROM TP_Student_Answers 
                                          WHERE student_id = 751)))

最后一个表 TP_Student_Answers 有大约 32,000 个条目。其余的要小得多。

我意识到我应该索引大表中的一些行。隔开它。还有其他问题吗?

【问题讨论】:

  • 你为什么不尝试加入?
  • 我听说过 JOINS。我不知道你可以像下面的 TI 那样嵌套它们。猜猜这就是乐于助人和粗鲁之间的区别。

标签: mysql sql select where-in


【解决方案1】:

您应该使用joins 并考虑至少在foreign keys 上创建索引

试试下面的

SELECT DISTINCT TP_Test_Info.id, TP_Test_Info.name
FROM TP_Test_Info
JOIN TP_Test_Sections 
  ON TP_Test_Sections.test_id = TP_Test_Info.id
JOIN TP_Test_Questions 
  ON TP_Test_Questions.section_id = TP_Test_Sections.id
JOIN TP_Student_Answers 
  ON TP_Student_Answers.question_id = TP_Test_Questions.id
WHERE TP_Student_Answers.student_id = 751

【讨论】:

  • 使用联接有什么好处?我会用这个,只是想知道为什么这是有利的。
  • 数据库引擎将更容易优化查询,利用索引等。另外,IN 并不是性能最好的运算符,即使它“有意义”,也可以使用 @ 987654325@。在您的查询中,当您考虑它时,您要求数据库做很多工作来有效地检查存在性,这对于数据库来说是通过连接更自然地实现的(想想“关系”而不仅仅是“逻辑” )。最好的办法可能是查看并比较两个查询的执行计划,以了解数据库如何处理它们。
  • 谢谢!我仍在努力解决 JOINS 问题。我是一名导师,而不是程序员,所以这些东西并不真正属于我的知识领域。只为我自己的网站做。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多