【发布时间】:2019-12-21 00:59:44
【问题描述】:
我有相当复杂的查询(使用 MySQL 8.0.11)
SELECT
x.id,
x.text,
x.campaign_id,
x.ad_group_id,
x.close_variant,
x.keywords,
x.terms,
x.impressions,
x.clicks,
x.conversion_value,
x.avg_position,
x.conversions,
x.cost,
x.campaigns,
x.ad_groups,
EXISTS (
SELECT
*
FROM
reports_biddablekeyword cbk
JOIN reports_keyword ck ON (cbk.keyword_id = ck.id)
wHERE
cbk.customer_id = 3512658134 AND
cbk.campaign_id = x.campaign_id AND
cbk.ad_group_id = x.ad_group_id AND
phrase_conflict(x.text, ck.text, ck.match_type)
) AS conflict,
EXISTS (
SELECT
*
FROM
reports_negativekeyword bnk
JOIN reports_keyword bk ON (bnk.keyword_id = bk.id)
wHERE
bnk.customer_id = 3512658134 AND
bnk.campaign_id = x.campaign_id AND
bnk.ad_group_id = x.ad_group_id AND
bk.match_type = 'PHRASE' AND
phrase_match(x.text, bk.text, bk.match_type)
)
AS blocked,
ROUND(x.clicks / x.impressions * 100, 1) AS ctr,
ROUND(x.cost / x.conversions, 2) AS cpa,
ROUND(x.cost / x.clicks, 2) AS cpc,
ROUND(x.conversion_value / x.cost, 2) AS roi
FROM
(
SELECT
p.id AS id,
p.text AS text,
r.campaign_id AS campaign_id,
r.ad_group_id AS ad_group_id,
IF(SUM(r.match_type_close_variant) = COUNT(*), "only", IF(SUM(r.match_type_close_variant) > 0, "some", "none")) AS close_variant,
COUNT(DISTINCT r.keyword_id) AS keywords,
COUNT(DISTINCT r.term) AS terms,
IFNULL(SUM(r.impressions), 0) AS impressions,
IFNULL(SUM(r.clicks), 0) AS clicks,
SUM(r.conversion_value) AS conversion_value,
ROUND(SUM(r.avg_position * r.impressions) / SUM(r.impressions), 2) AS avg_position,
ROUND(IFNULL(SUM(r.conversions), 0), 2) AS conversions,
ROUND(IFNULL(SUM(r.cost), 0), 2) AS cost,
COUNT(DISTINCT r.campaign_id) AS campaigns,
COUNT(DISTINCT r.ad_group_id) AS ad_groups
FROM
reports_row r
JOIN reports_phraserow pr ON (r.id = pr.row_id)
JOIN reports_phrase p ON (p.id = pr.phrase_id)
WHERE
(r.customer_id) = 3512658134 AND
(p.text != p.common_term) = 0
GROUP BY
r.campaign_id,
r.ad_group_id,
pr.phrase_id
HAVING
conversions = 0 AND
cost > 43.97137500000000091533811780
) AS x
HAVING
conflict = 0 AND
blocked = 0
ORDER BY
cost DESC
按原样运行查询,我得到 173 行结果。
在 ORDER BY 之后添加 LIMIT 我得到了奇怪的记录数
- ... LIMIT 1 - 0 行返回
- ... LIMIT 10 - 返回 0 行
- ... LIMIT 16 - 返回 1 行(返回任何行的最低限制)
- ... LIMIT 100 - 27 行返回
- ... LIMIT 297 - 172 行返回
- ... LIMIT 298 - 返回 172 行(返回与无限制查询相同的行的最低限制)
我不知道出了什么问题。
更新:我意识到将所有内容包装到 SELECT xxx.* FROM (...) AS xxx LIMIT N 会返回正确的结果。但我仍然很好奇为什么需要这样做。
UPDATE2:也用常量值替换存在的子查询使限制正常工作
【问题讨论】:
-
如果在外部
SELECT中使用WHERE而不是HAVING会发生什么?HAVING通常与GROUP BY结合使用,而您没有。