是否可以合并这些(长)mysql查询?

是否可以合并这些(长)mysql查询?,mysql,Mysql,好吧,我的困境是。我有一个管理页面,我用它来获取当天提交到我的一个网站的内容摘要。这个Suamry页面从几个表中提取数据,其中一些表存储实际的媒体数据,其他表存储网站URL、ID和所有者,另一个表存储日常统计数据,以计算每个域的输入/输出比率 此管理页面有一个主查询,它提取实际的媒体数据,如下所示: SELECT content.con_catid, content.con_posttime, content.con_url, content.con_id,

好吧,我的困境是。我有一个管理页面,我用它来获取当天提交到我的一个网站的内容摘要。这个Suamry页面从几个表中提取数据,其中一些表存储实际的媒体数据,其他表存储网站URL、ID和所有者,另一个表存储日常统计数据,以计算每个域的输入/输出比率

此管理页面有一个主查询,它提取实际的媒体数据,如下所示:

SELECT 
    content.con_catid,
    content.con_posttime,
    content.con_url,
    content.con_id,
    content.con_title,
    categories.name, 
    users.username, 
    users.user_id, 
        FROM content
        LEFT JOIN categories 
        ON (content.con_catid = categories.id) 
        LEFT JOIN users
        ON (content.con_poster = users.user_id)  
        WHERE con_status = 0 ORDER BY con_posttime
相当直截了当。然后,这就是它变得混乱的地方。每次它循环mysql\u fetch\u array语句以输出每个内容项时,我还运行以下两个查询:

SELECT count(con_id) as pending FROM content WHERE con_poster = '$this_userid' AND con_status = 0

SELECT count(con_id) as approved FROM content WHERE con_poster = '$this_userid' AND con_status = 2
这些将获取拥有提交的每个用户的待处理和已批准项目的数量,该数量列在每个提交的旁边

还有一个杀手,它增加了很多页面执行时间,因为它还必须对初始查询的每一行重复执行

SELECT website_url, 
website_id, 
website_shady, 
COALESCE(sum(dstats_hits),0)+website_in_ballast as total_in, 
COALESCE(sum(dstats_hits_out),0)+website_out_ballast as total_out, 
sum(dstats_hits_out_paid) as total_paid, 
website_in_ballast, 
website_out_ballast 
  FROM websites 
    LEFT JOIN domain_stats ON (websites.website_id = domain_stats.dstats_domid) 
    WHERE website_id IN (SELECT website_id FROM websites WHERE website_userid = $this_userid)
    GROUP BY website_url

有没有办法将后3个查询合并到第一个查询中?因为现在。。。。如果队列中有100个项目,那么如果包含子查询,这就是301查询401,生成页面需要一段时间

我还没有考虑第三个附加查询,但对于前两个,您可能可以执行以下操作:

SELECT count(con_id) as pending, con_poster FROM content 
WHERE con_status = 0
GROUP BY con_poster

然后加入到con_poster上的第一个查询中。

这个功能对我来说很方便,也许它也会帮助你。 您可以使用查询作为选择之一

SELECT 
    col_1,
    col_2,
    col_3,
    (
        SELECT col_1
        FROM table_2
        WHERE table_2.col_2 = table_1.col_1
    ) as 'col4',
    col_5
FROM
    table_1

完全合法。

嗯。。。第一个查询只选择内容项,而其他查询则选择有关内容项的一些统计信息。第一个查询不使用任何聚合函数,而所有其他查询都使用。因此,我能看到的加入它们的唯一方法是使用子查询。它不会使执行计划变得更好,但会为您节省数百个查询分析和结果集生成,因此它应该会更快一些

不过有一个提示-中间的两个查询可以这样连接在一起:

SELECT
    count(case when con_status=0 then 1 else null end) as pending,
    count(case when con_status=2 then 1 else null end) as approved
FROM
    content
WHERE
    con_poster = '$this_userid'

对于特定的用户id,再加入一次内容,您也可以进行计数

SELECT content.con_catid, content.con_posttime, content.con_url, content.con_id, content.con_title, categories.name, users.username, users.user_id, IFNULL(SUM(CASE WHEN c2.con_status = 0 THEN 1 ELSE 0 END), 0) as pending, IFNULL(SUM(CASE WHEN c2.con_status = 2 THEN 1 ELSE 0 END), 0) as approved FROM content LEFT JOIN categories ON (content.con_catid = categories.id) LEFT JOIN users ON (content.con_poster = users.user_id) LEFT JOIN content as c2 ON users.user_id = c2.con_poster WHERE con_status = 0 GROUP BY content.con_id ORDER BY con_posttime 这是未经测试的。您可能可以两次加入内容,并将COUNTDISTINCT c2.con_id用作挂起,将COUNTDISTINCT c3.con_id用作已批准,如果CASE语句变慢,则可以在挂起帖子的join子句中添加c2.con_status=0

如果为空,只是为了防止您没有任何帖子,因为主内容行始终存在,所以这些帖子永远不会为真。如果不想计算当前帖子的数量,可以在JOIN子句中禁用当前帖子

对于最后一个查询,我将为您正在处理的所有用户选择所有信息保存所有id,然后使用用户id调用它,或者根据您的选择方式进行子选择


然后用代码对数据进行排序和处理。这将最小化查询的数量

下面是另一个将其变成一个巨大查询的尝试。不知道会有多快

编辑:好的,第三次尝试。如果您设置了正确的索引,这实际上应该是非常快速的

SELECT 
    content.con_catid,
    content.con_posttime,
    content.con_url,
    content.con_id,
    content.con_title,
    categories.name, 
    users.username, 
    users.user_id, 
    stats1.website_url, 
    websites.website_id, 
    websites.website_shady,
    websites.website_in_ballast, 
    websites.website_out_ballast,
    (SELECT COALESCE(sum(dstats_hits),0)+website.website_in_ballast FROM domain_stats WHERE websites.website_id = domain_stats.dstats_domid) as total_in,
    (SELECT COALESCE(sum(dstats_hits_out),0)+website_out_ballast FROM domain_stats WHERE websites.website_id = domain_stats.dstats_domid) as total_out,
    (SELECT sum(dstats_hits_out_paid) FROM domain_stats WHERE websites.website_id = domain_stats.dstats_domid) as total_paid,
    (SELECT count(c2.con_id) FROM content c2 WHERE c2.con_poster = user.user_id AND con_status = 0) as pending,
    (SELECT count(c2.con_id) FROM content c2 WHERE c2.con_poster = user.user_id AND con_status = 2) as approved
FROM
    content
    LEFT JOIN categories ON (content.con_catid = categories.id) 
    LEFT JOIN users ON (content.con_poster = users.user_id)
    LEFT JOIN websites ON (website_userid=users.user_id)
WHERE
    con_status = 0
ORDER BY
    con_posttime

问题-上一个查询中的子查询是否有原因?你不能直接写下website\u userid=$this\u userid吗?看起来没有必要。因为它返回多个website\u id,而不仅仅是一个。