php - 连接 2 个 mysql 查询

标签 php mysql sql

我有 2 个表:

用户

编号 |用户

喜欢

编号 |拥有者 |日期

这个查询:

$owner_result = $connector->query("SELECT id FROM users");
while($owner = $connector->fetchArray($owner_result))
{
$rs = $connector->query("SELECT count(id) AS num FROM likes 
WHERE date > DATE_SUB(NOW(), INTERVAL 1 WEEK) 
AND owner='$owner[id]' 
ORDER BY num DESC LIMIT 5");
while($rw = $connector->fetchArray($rs)) 

{echo "This owner ($owner[id]) has $rw[num] likes this week";}

}

我想要做的是返回 5 users.id 行,其中行数在 likes 表中最大。 我的查询只返回 $owner[id] 但不是每个人的点赞数。而且我认为我的查询的性能也很低,因为我的查询会检查 likes 表中每个 users.id 的喜欢数量,但可能是喜欢 < strong>table 不包含一些 users.id

任何解决我的问题或改进我的查询的建议都将非常受欢迎。 谢谢。

最佳答案

我认为单个查询会为您提供指定的结果,例如:

SELECT u.id
     , COUNT(t.owner) AS cnt_likes
  FROM users u
  JOIN likes t
    ON t.owner = u.id
 WHERE t.date > DATE_SUB(NOW(), INTERVAL 1 WEEK)
 GROUP BY u.id
 ORDER BY 2 DESC
 LIMIT 5

likes 上的适当索引表应该提高性能:

... ON likes (owner, date)

或者,这将给出等效的结果,可能具有(稍微)更好的性能:

SELECT u.id
     , t.cnt_likes
  FROM users u
  JOIN ( SELECT s.owner
              , COUNT(1) AS cnt_likes
           FROM likes s
          WHERE s.date > DATE_SUB(NOW(), INTERVAL 1 WEEK)
          GROUP BY s.owner
       ) t
    ON t.owner = u.id
 ORDER BY t.cnt_likes DESC
 LIMIT 5

如果可以保证 owner 的所有值,您将获得更好的性能。 likes 中的列表实际上是id user 中的值表...因为您可以避免连接到用户表,并从 likes 中获取整个结果表:

SELECT s.owner
     , COUNT(1) AS cnt_likes
  FROM likes s
 WHERE s.date > DATE_SUB(NOW(), INTERVAL 1 WEEK)
 GROUP BY s.owner
 ORDER BY cnt_likes DESC
 LIMIT 5

但是,该查询不会检查以验证从 owner 返回的值列存在于 iduser 的专栏表。

关于php - 连接 2 个 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970385/

相关文章:

php - Yii 授权和重定向

php - 使用 PHP 脚本运行 shell 命令

mysql - 跨表选择,不包括连接表的第一行和最后一行

mysql - 加入后设置别名属性名称

php - 如何找到重叠的日期范围之间的其余部分

php - 如何为与其他字段名称相同的字段创建别名?

mysql - 如何执行 "on delete row from ` user`,用该用户名删除 `message` 中的所有内容”?FK 还是触发器?

mysql - 将值以 x 开头的行排序在包含 x 的行之前

php - 在php中显示表中的数据

sql - 服务器迁移后从 TFS 和 SQL 中删除 "dead"用户帐户