Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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:如何在单个查询中优化这些MySQL查询?_Php_Mysql_Sql - Fatal编程技术网

PHP:如何在单个查询中优化这些MySQL查询?

PHP:如何在单个查询中优化这些MySQL查询?,php,mysql,sql,Php,Mysql,Sql,是否可以在单个查询中优化以下内容 我在这里假设一个查询比使用临时表的多个查询更有效,所以如果我的假设不正确,请告诉我 $id是当前成员id$list是要从最终结果中删除的项目ID列表(例如,已下载的项目) 此查询的作用是查找已将类似项目下载到$id成员的前500名成员。然后查找这些成员下载的所有项目,根据每个成员的类似下载次数和每个项目的总下载次数按分数排序。因此,最终结果是$id成员的建议列表 查询如下: mysql_query('CREATE TEMPORARY TABLE temp1 EN

是否可以在单个查询中优化以下内容


我在这里假设一个查询比使用临时表的多个查询更有效,所以如果我的假设不正确,请告诉我

$id
是当前成员id<代码>$list是要从最终结果中删除的项目ID列表(例如,已下载的项目)

此查询的作用是查找已将类似项目下载到
$id
成员的前500名成员。然后查找这些成员下载的所有项目,根据每个成员的类似下载次数和每个项目的总下载次数按分数排序。因此,最终结果是
$id
成员的建议列表

查询如下:

mysql_query('CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY AS
(SELECT a.memberid, COUNT(*) `score` FROM table_downloads a INNER JOIN
(SELECT itemid FROM table_downloads WHERE memberid='.$id.') b ON a.itemid = b.itemid
WHERE a.memberid!='.$id.' GROUP BY a.memberid HAVING score>0 ORDER BY score DESC LIMIT 500)');

$res=mysql_query('SELECT table_downloads.itemid,COUNT(table_downloads.itemid*temp1.score) AS score2
FROM table_downloads,temp1
WHERE table_downloads.memberid=temp1.memberid AND table_downloads.itemid NOT IN ('.$list.') 
GROUP BY table_downloads.itemid
ORDER BY score2 DESC LIMIT 30');

mysql_query('DROP TABLE temp1');
如果有几百万行,这个查询可能会花费太长时间而无法使用。任何关于确保其快速执行的建议也将不胜感激

*我故意使用mysql\u查询。请不要告诉我使用mysqli。*

  • 无法使用
    mysql\u query()
  • 在这种情况下,认为将3个电话合并到一个电话中可以节省一些明显的费用是错误的
  • 很明显,这是一个非常常见的错觉——认为一个凌乱的查询比多个查询运行得更快。不会的

  • 无法使用
    mysql\u query()
  • 在这种情况下,认为将3个电话合并到一个电话中可以节省一些明显的费用是错误的

  • 很明显,这是一个非常常见的错觉——认为一个凌乱的查询比多个查询运行得更快。不会的。

    出于兴趣,我有一个剧本

    我认为这是可能的,虽然不漂亮,我怀疑比你现在的剧本慢

    SELECT table_downloads.itemid, COUNT(table_downloads.itemid * temp1.score) AS score2
    FROM table_downloads
    INNER JOIN (SELECT a.memberid, COUNT(*) `score` 
                FROM table_downloads a 
                INNER JOIN table_downloads b
                ON  a.itemid = b.itemid AND b.memberid='.$id.' AND a.memberid=b.memberid
                GROUP BY a.memberid 
                ORDER BY score DESC
                LIMIT 500) temp1
    ON table_downloads.memberid = temp1.memberid 
    WHERE table_downloads.itemid NOT IN ('.$list.') 
    GROUP BY table_downloads.itemid
    ORDER BY score2 DESC 
    LIMIT 30
    

    虽然没有真正测试过(不知道你的桌子布局)

    出于兴趣,我有一个剧本

    我认为这是可能的,虽然不漂亮,我怀疑比你现在的剧本慢

    SELECT table_downloads.itemid, COUNT(table_downloads.itemid * temp1.score) AS score2
    FROM table_downloads
    INNER JOIN (SELECT a.memberid, COUNT(*) `score` 
                FROM table_downloads a 
                INNER JOIN table_downloads b
                ON  a.itemid = b.itemid AND b.memberid='.$id.' AND a.memberid=b.memberid
                GROUP BY a.memberid 
                ORDER BY score DESC
                LIMIT 500) temp1
    ON table_downloads.memberid = temp1.memberid 
    WHERE table_downloads.itemid NOT IN ('.$list.') 
    GROUP BY table_downloads.itemid
    ORDER BY score2 DESC 
    LIMIT 30
    

    虽然没有经过真正的测试(不知道您的表布局)

    您始终可以连接字符串,并用分号(
    )分隔。“我在这里假设一个查询比使用临时表的多个查询更有效。”--您为什么这么认为?试着用剪刀一次剪下整本书。然后一页接一页地尝试。哪一种效率更高?如果让您的查询更具可读性,这将非常有帮助;)@任何人,你以前都应该看过(都在一条线上)虽然我通常是单一查询的粉丝,但在这种情况下,您有非平凡的查询,并且只有两个查询,因此任何节省都可能是微不足道的。但是,查看您的查询,have似乎是多余的(当分数计算结果记录时,您有一个内部联接)。此外,您还可以很容易地消除子选择。这些更改可能会略微加快您的查询速度。还可以考虑将$列表细节放入另一个临时表中,并使用外部连接来排除它们,您可以始终加入一个分号分隔的字符串(<代码>;<代码> >)。“我假设在这里,单个查询将更有效率地使用一个临时表进行多个查询”---你为什么这样认为?试着用剪刀一次剪下整本书。然后一页接一页地尝试。哪一种效率更高?如果让您的查询更具可读性,这将非常有帮助;)@任何人,你以前都应该看过(都在一条线上)虽然我通常是单一查询的粉丝,但在这种情况下,您有非平凡的查询,并且只有两个查询,因此任何节省都可能是微不足道的。但是,查看您的查询,have似乎是多余的(当分数计算结果记录时,您有一个内部联接)。此外,您还可以很容易地消除子选择。这些更改可能会略微加快您的查询速度。此外,考虑将清单列表细节放入另一个临时表中,并使用外部连接排除此答案:将查询发送到SQL Server是毫秒的问题。运行查询需要很长时间。通过同时发送所有三个查询,您只需节省几毫秒的时间。改为优化SQL查询。除此之外,将查询发送到SQL server只需几毫秒。运行查询需要很长时间。通过同时发送所有三个查询,您只需节省几毫秒的时间。而是优化SQL查询。