[英]Connect 2 mysql queries
我有2张桌子:
使用者
id | 用户
喜欢
id | 业主| 日期
而这个查询:
$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行与中行喜欢表的最大ammount的。 我的查询返回的只是$ owner [id],而没有返回每个人的喜欢数目。 而且我想查询的性能是非常低的,以及因为我的查询检查喜欢的量为喜欢表中的每个users.id,但它可能是一个喜欢表不包含一些users.id。
任何解决我的问题或改善我的查询的建议都将受到欢迎。 谢谢。
您必须在第二个查询中按所有者分组。 如果不先对行进行分组,就无法计数。
$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]'
Group BY owner
ORDER BY num DESC LIMIT 5");
while($rw = $connector->fetchArray($rs))
{echo "This owner ($owner[id]) has $rw[num] likes this week";}
}
您应该将两个表连接起来,以便可以在一个语句中获取数据:
SELECT
users.id,
COUNT(likes.id) AS mylikes -- specify a name for the computed column
FROM users
INNER JOIN likes
ON users.id = likes.owner
WHERE date > DATE_SUB(NOW(), INTERVAL 1 WEEK)
GROUP BY users.id
ORDER BY COUNT(likes.id) DESC -- MySQL would allow the alias name
LIMIT 5 -- because you want the top 5
如果有平局,那么您将失去一个(或更多)记录。
我认为单个查询将为您提供指定的结果,例如:
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
如果可以保证likes
表中owner
列的所有值实际上都是user
表中的id
值,那么您将获得更好的性能...因为您可以避免联接到users表,并从中获取整个结果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
列返回的值是否存在,就像在user
表的id
列中一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.