在忽略空值的情况下将一列拆分为多列的用例

rn0zuynd  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(481)

我对sql还比较陌生,尝试过很多次搜索,但都不能完成我想要的。
我的自定义字段值包含在一个表和列中,每个自定义字段都有自己的id,但存储的值在一列中。
我试图为每个自定义字段获取一列及其关联值,以下是我的查询:

  1. SELECT PRODUCT.id AS ProductId, PRODUCT.num AS ProductNumber,
  2. CASE WHEN customvarcharlong.customfieldid = '6' THEN customvarcharlong.info
  3. END AS OEM1Name,
  4. CASE WHEN customvarcharlong.customfieldid = '7' THEN customvarcharlong.info
  5. END AS OEM1NumbersA
  6. FROM product
  7. JOIN customvarcharlong ON product.id=customvarcharlong.recordid
  8. JOIN customfield ON customvarcharlong.customfieldid=customfield.id
  9. WHERE PRODUCT.activeFlag = TRUE
  10. ORDER BY PRODUCT.id

我的问题是,对于每个具有值的自定义字段,我都会得到一行,而case语句只会为每个与customfieldid不匹配的字段返回null。

  1. 2 00007 NULL NULL
  2. 2 00007 NULL NULL
  3. 2 00007 NULL NULL
  4. 2 00007 NULL NULL
  5. 2 00007 NULL NULL
  6. 2 00007 Comp1 NULL
  7. 2 00007 NULL 1234
  8. 2 00007 NULL NULL
  9. 2 00007 NULL NULL

以下是我想要的结果:

  1. 2 00007 Comp1 1234

使用where或groupby可以消除一些数据,因为它们位于不同的行上。这可能吗?我有48个自定义字段添加,所以你可以想象得到得到它的权利将节省大量的工作。
谢谢!
编辑以从customvarcharlong添加示例数据:

  1. +--------+---------------+-------+----------+
  2. | id | customFieldId | info | recordId |
  3. +--------+---------------+-------+----------+
  4. | 170887 | 171 | N | 1481 |
  5. | 170888 | 172 | 3.03 | 1481 |
  6. | 170889 | 173 | new | 1481 |
  7. | 170890 | 170 | 0 | 1481 |
  8. | 170891 | 5 | 0 | 1481 |
  9. | 170892 | 6 | OEM1 | 1481 |
  10. | 170893 | 7 | Num1 | 1481 |
  11. | 170894 | 200 | 4184 | 1481 |
  12. | 170895 | 120 | Truck | 1481 |
  13. +--------+---------------+-------+----------+

正如您可能知道的,问题是recordid会重复存在的自定义字段值,而customfieldid会在每个recordid上重复。我想为每一个recordid(recordid=productid)获取它自己列中每一行的info值。

q7solyqu

q7solyqu1#

您正在使用eav数据模型。实际上,您需要一个单独的左连接到values表( customvarcharlong )对于每个属性( customfieldid )要返回给定的一组实体( product ).
这样试试:

  1. SELECT PRODUCT.id AS ProductId,
  2. PRODUCT.num AS ProductNumber,
  3. cvcl6.info AS OEM1Name,
  4. cvcl7.info AS OEM1NumbersA
  5. FROM product
  6. LEFT JOIN customvarcharlong cvcl6
  7. ON product.id=cvcl6.recordid
  8. AND cvcl6.customfieldid = '6'
  9. LEFT JOIN customvarcharlong cvcl7
  10. ON product.id=cvcl7.recordid
  11. AND cvcl7.customfieldid = '7'
  12. WHERE PRODUCT.activeFlag = TRUE
  13. ORDER BY PRODUCT.id

相关问题