MySQL 复杂连接优化

标签 mysql

我有一个结果集,我使用以下方法从三个表之间的连接中获得:

SELECT X.*, Y.Name FROM `A` AS X
INNER JOIN `B` AS Y
INNER JOIN `C` AS Z
ON X.id=Y.id AND X.categoryID=Z.categoryID
WHERE X.userID_FK=%d AND X.listID_FK=%d 
ORDER BY Z.categoryRank ASC

我有第四个表“D”,其中包含:

-------------------------------
  id_FK    userID_FK    vote
-------------------------------

这里 (id_FK, userID_FK) 对是一个 PK。

第一个查询返回的每个 X.id 可能在 D 表中有多个条目。通常,对于每个返回的行,为了计算每个 id 的投票数,我会编写如下查询:

SELECT SUM(vote) FROM D WHERE `id`=%d

我想知道我是否可以将这两个查询优化为一个查询,因为当前方案导致 O(n) 执行时间。 n 是第一个查询返回的结果数。

最佳答案

你可以这样简单地做

SELECT
X.*,
Y.Name,
(SELECT
   SUM(vote)
   FROM D
   WHERE `id` = X.id) as Count
FROM `A` AS X
INNER JOIN `B` AS Y
INNER JOIN `C` AS Z
ON X.id = Y.id
  AND X.categoryID = Z.categoryID
WHERE X.userID_FK =  % d
AND X.listID_FK =  % d
ORDER BY Z.categoryRank ASC

关于MySQL 复杂连接优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10309937/

相关文章:

mysql - 如何存储关键字/标签

mysql - 在 MYSQL 上使用通配符授予用户权限

php - 当我通过 nginx 使用 mysql_connet 但命令行运行正常时权限被拒绝

php - 从数据库中获取json格式的对象

java - Where() 在(选择)H2

php - 如何使用 mysql 和 php 编写一个系统来跟踪用户学习进度

mysql - 您的 SQL 语法有问题但不知道原因

php - 如何使用数据库扩展 PDO 在 PHP 中编写多查询

mysql - mysql查询中的逗号分隔字符串比较

mysql - 维护 neo4j 和 mysql 数据存储之间的一致性