MySQL LIMIT语句,返回的行数错误
我有一个非常复杂的查询(使用MySQL 8.0.11) 按原样运行查询的结果是173行 在订单之后增加限制,我得到了很多记录MySQL LIMIT语句,返回的行数错误,mysql,sql,sql-limit,Mysql,Sql,Sql Limit,我有一个非常复杂的查询(使用MySQL 8.0.11) 按原样运行查询的结果是173行 在订单之后增加限制,我得到了很多记录 。。。限制1-返回0行 。。。限制10-返回0行 。。。限制16-返回1行(返回任何行的最低限制) 。。。限制100-返回的27行 。。。限制297-返回172行 。。。限制298-返回172行(返回与无限查询相同行的最低限制) 我不知道怎么了 更新:我意识到将所有内容包装到选择xxx.*FROM(…)作为xxx LIMIT N将返回正确的结果。但我仍然很好奇为什么需
- 。。。限制1-返回0行
- 。。。限制10-返回0行
- 。。。限制16-返回1行(返回任何行的最低限制)
- 。。。限制100-返回的27行
- 。。。限制297-返回172行
- 。。。限制298-返回172行(返回与无限查询相同行的最低限制)
选择xxx.*FROM(…)作为xxx LIMIT N
将返回正确的结果。但我仍然很好奇为什么需要这样做
UPDATE2:还可以使用常量值替换exists子查询,使limit正常工作您有一个聚合查询,其中没有
GROUP BY
您应该会得到一个语法错误,但是您显然已经覆盖了MySQL 8的默认设置
未聚合的列来自任意行。这些值可以在不同的运行中更改
您不一致的结果远非一个谜,这就是为什么
现在只有
是默认设置,以及为什么几乎所有其他数据库都遵循SQL标准,不允许像您这样的查询。如果您使用WHERE
而不是在外部SELECT
中包含
,会发生什么<代码>拥有通常与分组依据
结合使用,但您没有。确实,查询滥用mysql默认行为并将非聚合文件(文本、id)放入结果中,因为组的所有值都相等。仍然很神秘的是,我的查询不会产生任何错误,即使只启用了“全组”。(尝试了明显无效的查询,但确实如此)。第二,即使我将文本和id放入组id,它仍然不会改变限制behavior@farincz . . . 你没抓住重点。这不是limit
的行为。这是拥有
的行为。问题是过滤掉哪些行。这在每次运行时都是不确定的。有时查询返回的一行被过滤掉;有时不是。我不明白这与分组有什么联系。在对查询进行实验之后,我发现如果查询不包含存在的子查询,或者在此列上有条件,那么限制是可以的
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