我有 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
返回的值列存在于 id
中user
的专栏表。
关于php - 连接 2 个 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970385/