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