Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接2个mysql查询_Php_Mysql_Sql - Fatal编程技术网

Php 连接2个mysql查询

Php 连接2个mysql查询,php,mysql,sql,Php,Mysql,Sql,我有两张桌子: 用户 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

我有两张桌子:

用户

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行,其中likes表中的行数最多。 我的查询只返回$owner[id],但不返回每个人的喜欢数量。我认为我的查询的性能也很低,因为我的查询检查了喜欢表中每个用户的喜欢程度。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]'
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";}

}

您必须在第二个查询中按所有者分组。如果不先对行进行分组,则无法对行进行计数

$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";}

}

您必须在第二个查询中按所有者分组。如果不先对行进行分组,则无法对行进行计数

$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";}

}

您必须在第二个查询中按所有者分组。如果不先对行进行分组,则无法对行进行计数

$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
    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
    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
    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
或者,这将产生相同的结果,可能具有(稍微)更好的性能:

... 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
值,您将获得更好的性能。。。因为您可以避免加入用户表,并从
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
列中的值一样存在。

我认为单次查询可以得到指定的结果,例如:

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
或者,这将产生相同的结果,可能具有(稍微)更好的性能:

... 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
值,您将获得更好的性能。。。因为您可以避免加入用户表,并从
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
列中的值一样存在。

我认为单次查询可以得到指定的结果,例如:

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
或者,这将产生相同的结果,可能具有(稍微)更好的性能:

... 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
值,您将获得更好的性能。。。因为您可以避免加入用户表,并从
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
列中的值一样存在。

我认为单次查询可以得到指定的结果,例如:

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
或者,这将产生相同的结果,可能具有(稍微)更好的性能:

... 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
值,您将获得更好的性能。。。因为您可以避免加入用户表,并从
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
列中。

谢谢。但它只显示了2个条目,而不是所需的5个条目。谢谢。但它只显示了2个条目,而不是所需的5个条目。谢谢。但它只显示了2个条目,而不是所需的5个条目。谢谢。但它只显示2个条目,而不是所需的5个条目。不幸的是,它没有显示我的某些信息,它没有显示我的某些信息,它没有显示我的某些信息,它没有显示我的任何信息something@Valerius马扎雷:你的直觉是对的;运行单个查询并从MySQL服务器获取单个结果集通常比执行“循环”运行多个查询要高效得多。(这也使得代码更简洁。)但是,它并不总是更高效;在一些边缘情况下,运行优化的单例查询实际上比使用可怕的访问计划的庞大查询更有效,但这更多的是例外而不是规则。)@Valerius Mazare:你的直觉是对的;通常,运行单个查询并获取