【问题标题】:SQL Join 3 Tables and concatenate valuesSQL 连接 3 个表并连接值
【发布时间】:2020-09-16 21:43:35
【问题描述】:

我有 3 个具有 n:m 关系的表

语言:

  • ID(主键)
  • 姓名
  • 蛞蝓

产品:

  • 身份证
  • 姓名
  • 蛞蝓 -产品组

关系表:

Lang_Prod:

  • lang_prod_id(由 lang_id 和 prod_id 组成)
  • lang_id
  • prod_id

现在我想获取所有具有相应语言名称的产品:

  • 产品
  • 产品组
  • 语言名称(多个值)

我试过了:

SELECT product.*, languages_products.language_id,
       GROUP_CONCAT(languages_products.language_id) as languages
FROM product
  INNER JOIN languages_products ON id = languages_products.product_id
GROUP BY product.id;

结果是:

  • 产品名称
  • product_slug
  • product_group
  • 带有语言 ID 的字符串

我想要一个带有语言名称的字符串,而不是带有语言 ID 的字符串

我该如何存档?

【问题讨论】:

  • 该 GROUP BY 无效,应引发错误。您通常 GROUP BY 与您 SELECT 相同的列,但那些作为设置函数的参数的列除外。
  • 它工作正常,但不是我需要的
  • “工作正常,但不是我需要的”是矛盾的。
  • @jarlh 不,不是。它没有引发任何错误(工作正常),但仍然不是我需要的(不是我需要的)

标签: mysql sql


【解决方案1】:

你需要加入语言表

SELECT product.id,product.name,product.productgroup,
       GROUP_CONCAT(l.name) as languages
FROM product
      INNER JOIN languages_products ON id = languages_products.product_id
      INNER JOIN languages l ON languages_products.language_id=l.id
    GROUP BY product.id,product.name,product.productgroup

【讨论】:

  • 将在较新的 MySQL 版本中引发错误。 (除非在兼容模式下。)
【解决方案2】:

您需要使用languages 表添加另一个联接,并使用其中的name 列。不过,我会将其分组到内部查询中:

SELECT p.*, languages
FROM  product p
JOIN  (SELECT   product_id, GROUP_CONCAT(l.name) as languages
       FROM     languages_products lp
       JOIN     languages l ON lp.language_id = l.id
       GROUP BY product_id) cl ON cl.product_id = p.id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2015-03-24
    • 2011-09-18
    相关资源
    最近更新 更多