为什么GROUP_CONCAT重复列名而不是列值?(MySQL 5.7)

ajsxfq5m  于 2023-02-07  发布在  Mysql
关注(0)|答案(1)|浏览(146)

我正在knex中编写一个迁移文件,以便向MySQL 5.7数据库添加一个视图。
此迁移为使用GROUP_CONCAT的查询创建视图。
我使用下面的代码来创建这个视图,它非常接近于工作,但是GROUP_CONCAT重复地连接值“pf.family“,而不是pf.family的实际列值。

/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
exports.up = function (knex) {
  return knex.schema.createViewOrReplace(
    "product_families_view",
    function (view) {
      view.columns(["product_id", "part_number", "families"]);
      view.as(
        knex("product_families AS pf")
          .select([
            "pfp.product_id",
            "pfp.part_number",
            knex.raw("GROUP_CONCAT(? ORDER BY ? SEPARATOR ?) as ?", [
              "pf.family",
              "pf.family",
              " ",
              "families",
            ]),
          ])
          .innerJoin(
            "product_families_products AS pfp",
            "pfp.family_id",
            "pf.id"
          )
          .groupBy("pfp.product_id")
      );
    }
  );
};

这将生成以下视图:

我不确定为什么要重复“pf.family“,而不是我试图连接的实际pf.family列值。

7jmck4yq

7jmck4yq1#

哎呀。看起来使用绑定导致了这个问题。

/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
exports.up = function (knex) {
  return knex.schema.createViewOrReplace(
    "product_families_view",
    function (view) {
      view.columns(["product_id", "part_number", "families"]);
      view.as(
        knex("product_families AS pf")
          .select([
            "pfp.product_id",
            "pfp.part_number",
            knex.raw(
              "GROUP_CONCAT(pf.family ORDER BY pf.family SEPARATOR ' ') as families"
            ),
          ])
          .innerJoin(
            "product_families_products AS pfp",
            "pfp.family_id",
            "pf.id"
          )
          .groupBy("pfp.product_id")
      );
    }
  );
};

这解决了问题

相关问题