【问题标题】:MySQL Error 1349 SELECT in SubQuery Issue子查询问题中的 MySQL 错误 1349 SELECT
【发布时间】:2015-02-17 15:57:40
【问题描述】:

花了相当长的时间思考如何正确地从几个表中获取结果,我绝对回到了第一个问题,因为 MySQL 中的视图不允许我使用子查询创建一个。 .

我发现了一个类似的线程,指出我可以为子查询编写单独的视图,但尝试过这个后我让自己有点混乱。

我原来的查询是:

SELECT a.*
    FROM (SELECT H.username, 
    H.variety,
    IFNULL(SUM(H.weight),0) - IFNULL(HU.weight,0) As qty
        FROM harvest H
            LEFT JOIN harvest_used HU
            ON H.variety = HU.variety AND H.username = HU.username
            WHERE H.username = 'palendrone'
            GROUP BY H.variety
            ORDER BY H.variety ASC
     ) a

现在这可以完美运行,但如前所述,我无法弄清楚我需要做什么才能将其转换为在我的 MySQL 服务器上作为视图运行...

任何指导或帮助将不胜感激,谢谢。

【问题讨论】:

  • 你得到的确切错误是什么?

标签: mysql subquery sql-view


【解决方案1】:

您的外部查询没有做任何事情,所以只需将其删除:

SELECT H.username, H.variety,
       COALESCE(SUM(H.weight), 0) - COALESCE(SUM(HU.weight, 0)) As qty
FROM harvest H LEFT JOIN
     harvest_used HU
     ON H.variety = HU.variety AND H.username = HU.username
WHERE H.username = 'palendrone'
GROUP BY H.variety
ORDER BY H.variety ASC;

MySQL 不允许视图的from 子句中的子查询。这是 MySQL 的一个特殊限制,似乎在任何其他数据库中都不存在。

【讨论】:

  • 哇 - 我不敢相信我的史诗般的错误!显示漫长的一天如何付出代价!我很高兴,同时我没有发现这一点!非常感谢您快速准确的帮助。只要网站允许,我就会将其标记为有帮助。
  • @Palendrone 。 . .通常解决这个问题要困难得多。您碰巧遇到了一个有用的情况,其中子查询可以被剥离。
  • 刚刚看了为什么有些数据是错误的,我发现上面有问题!我知道最终结果都是应有的两倍。我已经研究了原因并找到了一些解释,但仍然对如何在不使用 SubQuery 以允许我在 phpMyAdmin 的视图中使用它的情况下解决感到困惑。任何更多的帮助将不胜感激 - Thx
  • @Palendrone 。 . .尝试使用说明问题的示例数据设置 SQL Fiddle。
  • 在下面发布了解决方案,连接在 SUM 中创建了重复的行,很容易用 DISTINCT 修复。如果我注意到我修改的解决方案不正确,我将设置一个 SQL Fiddle - 好主意,谢谢@Gordon
【解决方案2】:

看到上述解决方案缺少 SUM 并且还重复了结果。使用 DISTINCT 似乎可以解决问题,这是我的答案:

SELECT H.username,
     H.variety,
     SUM(distinct(H.weight)) - SUM(distinct(HU.weight)) As qty
           FROM harvest H
                LEFT JOIN harvest_used HU
                ON H.variety = HU.variety AND H.username = HU.username
                WHERE H.username = 'palendrone'
                GROUP BY H.variety
                ORDER BY H.variety ASC

【讨论】:

  • 基本上没有理由曾经使用SUM(DISTINCT)。当两行具有相同的weight 时,您的结果将不正确。
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2020-02-08
  • 2014-06-21
  • 1970-01-01
  • 2011-10-20
相关资源
最近更新 更多