繁体   English   中英

连接2个mysql查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM