Php 连接2个mysql查询
我有两张桌子: 用户 id |用户 喜欢 id |所有者|日期 此查询: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
$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:你的直觉是对的;通常,运行单个查询并获取