【问题标题】:Query on the result of another query giving errors查询另一个给出错误的查询的结果
【发布时间】:2016-06-18 06:25:13
【问题描述】:

我正在尝试对另一个查询的结果集运行查询,但出现了我无法理解的错误。我敢肯定它很小,但我不知何故错过了它。这是查询:

SELECT
  RLID,
  NAME,
  GROUP_CONCAT(SUBQUERY.Items SEPARATOR ', ') AS Items
FROM
  (
  SELECT
    `rel_menu_item`.`ID` AS `RLID`,
    `menu`.`Name` AS `Menu_Name`,
    `item`.`Name` AS `Items`
  FROM
    `rel_menu_item`
  JOIN
    `menu` ON `menu`.`ID` = `rel_menu_item`.`Menu_ID`
  JOIN
    `item` ON `item`.`ID` = `rel_menu_item`.`Item_ID`
) AS SUBQUERY
GROUP BY
  SUBQUERY.Name

错误:

在分析过程中发现了 3 个错误。

  1. 应有表达式。 (在位置 90 的“(”附近)
  2. 意外令牌。 (在位置 90 的“(”附近)
  3. 这种类型的子句以前已解析过。 (靠近位置 95 的“SELECT”)

【问题讨论】:

  • Menu_Name 不是Name

标签: mysql sql


【解决方案1】:

我发现了错误。这是正确的查询:

SELECT
  SUBQUERY.RLID,
  SUBQUERY.Menu_Name,
  GROUP_CONCAT(SUBQUERY.Items SEPARATOR ', ') AS Items
FROM
  (
  SELECT
    rel_menu_item.ID AS RLID,
    menu.Name AS Menu_Name,
    item.Name AS Items
  FROM
    rel_menu_item
  JOIN
    menu ON menu.ID = rel_menu_item.Menu_ID
  JOIN
    item ON item.ID = rel_menu_item.Item_ID
) AS SUBQUERY
GROUP BY
  SUBQUERY.Menu_Name

【讨论】:

  • 我不明白你为什么有一个子查询。
【解决方案2】:

您应该在完全没有子查询的情况下编写此查询:

SELECT m.Id as RLID, m.Name as Menu_Name
      GROUP_CONCAT(i.name SEPARATOR ', ') AS Items
FROM rel_menu_item rmi JOIN
     menu m
     ON m.ID = rmi.Menu_ID JOIN
     item i
     ON i.ID = rmi.Item_ID
GROUP BY m.Id, m.Name;

注意事项:

  • 不需要子查询。
  • 表别名使查询更易于编写和阅读。
  • 最好使用主键表menu.id 中的列而不是引用外键中的列。它与内部连接并没有真正的区别,但它确实与外部连接有所不同;因此,这是一种不好的做法。
  • 您应该在GROUP BY 中包含所有 个非聚合列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2010-10-31
    相关资源
    最近更新 更多