MySQL LIMIT语句,返回的行数错误

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将返回正确的结果。但我仍然很好奇为什么需

我有一个非常复杂的查询(使用MySQL 8.0.11)

按原样运行查询的结果是173行

在订单之后增加限制,我得到了很多记录

  • 。。。限制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