【问题标题】:Joining Multiple Tables And Merging Data in MySQL在 MySQL 中连接多个表和合并数据
【发布时间】:2013-04-19 18:24:54
【问题描述】:

我有四张表要连接在一起,但一张表我想 group_concat 两条特定记录。

Product_to_category PC P_ID C_ID 1 1 2 2 2 3 1 3 产品P P_ID P_PRICE 1 12 2 3 3 4 产品_描述 PD P_ID Language_id PD_Name 1 1 筹码 1 2 芯片(用不同的语言) 2 1 苏打水 2 2 苏打水(另一种语言) 类别 说明 CD C_ID Language_id CD_Name 1 1 垃圾食品 1 2 垃圾食品(另一种语言) 2 1 饮料 2 2 饮料(用不同的语言) 3 1 进口 3 2 导入(使用不同的语言) Product_attribute PA P_ID A_ID Language_ID A_TEXT 1 1 1 品牌 A 1 2 1 300克 1 3 1 番茄酱 1 1 2 品牌 A 1 2 2 300克 1 3 2 番茄酱(不同语言) 2 1 1 品牌 B 2 2 1 500毫升 2 3 1 樱桃 2 1 2 品牌 B 2 2 2 500毫升 2 3 2 樱桃(不同语言)

我想做的如下:

P.P_ID |  P.P_PRICE | PD.LANGUAGE_ID | PD.PD_NAME | CD.C_ID | CD.CD_NAME | Attribute
------------------------------------------------------------------------------------
  1    |  12        |   1            | Chips      |  1      | Junk Food | Brand A 300g
  1    |  12        |   2            | Chips      |  1      | Junk Food | Brand A 300g
  2    |  3         |   1            | Soda       |  2      | Drinks    | Brand B 500mL
  2    |  3         |   2            | Soda       |  2      | Drinks    | Brand B 500mL
  2    |  3         |   1            | Soda       |  3      | Imported  | Brand B 500mL
  2    |  3         |   2            | Soda       |  3      | Imported  | Brand B 500mL
  1    |  12        |   1            | Chips      |  3      | Imported  | Brand A 300g
  1    |  12        |   2            | Chips      |  3      | Imported  | Brand A 300g

基本上,我正在尝试使用类别和属性加载产品。只需在没有 Product_attribute PA 的情况下加入表格即可正常工作。我无法弄清楚如何将属性放在一起。以下是我的代码:

select P.P_ID, P.P_PRICE, PD.LANGUAGE_ID, PD.PD_Name, CD.C_ID, CD.CD_NAME, 
(select group_concat(PA.A_TEXT) from PA where (PA.A_ID=1 or PA.A_ID=2) and PA.P_ID =
P.P_ID group by PA.P_ID) as attribute from PC left join PD on PC.P_ID = PD.P_ID
left join CD on PC.C_ID = CD.C_ID
left join P on P.P_ID = PC.P_ID
where PD.language_id = CD.language_id and (PD.language_id=1 or PD.language_id=2)

如果这有点令人困惑,我深表歉意

2013 年 4 月 26 日更新
这里总结了表格中的内容以及我想要完成的内容: Product_to_category PC 表将产品链接到他们的类别,并将类别链接到他们的产品。一个产品可以属于多个类别,一个类别可以属于多个产品。 P 表中的产品有其产品值,如价格,其描述在 product_description PD 表中。一个产品可以有两行产品描述(双语)。产品在 product_attribute PA 表中也具有属性值,例如品牌(“品牌 A”、“品牌 B”)和体积/重量(“300g”、“500ml”)。一个产品可以属于多个类别,一个类别可以有多个产品。每个类别有两个描述(双语)。我想要完成的是用正确的语言显示每个产品及其多个类别,并连接属性文本。

如果需要进一步解释,请告诉我。

【问题讨论】:

  • GROUP_CONCAT 应该在您的主 SELECT 子句中,而不是在子查询中。

标签: mysql join concat


【解决方案1】:
select P.P_ID, P.P_PRICE, PD.LANGUAGE_ID, PD.PD_Name, CD.C_ID, CD.CD_NAME, 
group_concat(DISTINCT PA.A_TEXT) as attribute
from PC left join PD on PC.P_ID = PD.P_ID
left join CD on PC.C_ID = CD.C_ID
left join P on P.P_ID = PC.P_ID
left join PA on PA.P_ID = P.P_ID AND (PA.A_ID=1 or PA.A_ID=2)
where PD.language_id = CD.language_id and (PD.language_id=1 or PD.language_id=2)
GROUP BY P.P_ID, PD.LANGUAGE_ID

FIDDLE

【讨论】:

  • +1 - 我正在创建自己的 SQL 小提琴,就在我来这里发布查询时,你打败了我。
  • 谢谢老兄!那很快!我为此苦苦挣扎了好几个小时!
  • 嗨,对不起,巴尔玛。结果不是我预期的。 PC中的记录数有6127条记录。将PC和CD连接在一起检索数据时将有12,000+条记录,而将PC和CD连接在一起检索数据时将有11,500+条记录。它超过实际记录数的原因是每张 CD 和 PD 可能有 2 种语言。我提取的查询仅提供 1000 多条记录。如果我解释不正确,请告诉我。感谢您的帮助!
  • 不,你不是。小提琴中的预期结果和实际结果有什么区别?我认为您问题中的预期结果是错误的。对于语言 2 的 Chips,CD_NAME 应该是“Junk Food (in a different language)”,而不是“Junk Food”。
  • 听起来你只需要将 C_ID 添加到 GROUP BY 子句中。
猜你喜欢
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多