【问题标题】:MySQL select from two column tableMySQL 从两列表中选择
【发布时间】:2015-06-08 18:22:32
【问题描述】:

我有一个只有 2 列的表。 例如

table product.combinations
Column 1: product.id
Column 2: attribute.id

Product.id 是唯一的 每个产品都可以有 1 个或多个属性。 没有属性的产品不在表中

例如

表 product.combinations

产品.id |属性.id

  1    |     1      |
  1    |     2      |
  2    |     1      |
  2    |     2      |
  5    |     1      |
  5    |     3      |
  9    |     2      |
  9    |     3      |
  9    |     5      |

现在我想选择下面的结果

产品.id |属性1 |属性2 |属性 3 |属性 4 |属性 5

  1    |     1      |    2       |            |            |
  2    |     1      |    2       |            |            |
  5    |     1      |    3       |            |            |
  9    |     2      |    3       |     5      |            |

我已经尝试过使用支点,但我无法获得好的结果。 谁能帮帮我?

【问题讨论】:

  • 在 MySQL 中有一个函数GROUP_CONCAT,它允许你在一个分组的语句中组合列值。
  • 是的,我已经读过一些关于它的内容,但我认为它也在将一列中的值连接起来。我想将所有值放在分隔列中,列别名为标题

标签: php mysql prestashop-1.6


【解决方案1】:

首先:不要在表格/列名中使用点/句点,这不起作用,请改用下划线。

其次,如果可以将所有属性id放在逗号分隔的列表中,则可以执行以下操作(使用MySQL的GROUP_CONCAT函数):

mysql> SELECT
    -> product_id, GROUP_CONCAT(attribute_id ORDER BY attribute_id) AS attributes
    -> FROM product_combinations
    -> GROUP BY product_id
    -> ORDER BY product_id;
+------------+---------------+
| product_id | attributes    |
+------------+---------------+
|          1 | 1,2           |
|          2 | 1,2           |
|          5 | 1,3           |
|          9 | 2,3,5         |
+------------+---------------+
4 rows in set (0.00 sec)

【讨论】:

  • 是的,这似乎可行,但确实用逗号分隔。是否可以在单独的列中显示它。在其他地方我发现 select p.id_product_attribute, p.id_attribute, count(*) as seqnum from ps_product_attribute_combination p left outer join ps_product_attribute_combination pprev on p.id_product_attribute = pprev.id_product_attribute and p.id_attribute >= pprev.id_attribute group by p.id_product_attribute, p.id_attribute 结果是一个三列的表,额外的列有一个标题 segnum 并计算产品每个属性的位置
  • 抱歉布局很糟糕
  • 是的,这可行,但是,每个产品属性组合仍然只有一行。逗号分隔的列表有什么问题?例如,您可以在 PHP 中展开该列表,或使用 IN(...) 在 MySQL 中进行比较。
  • 是的,那么我仍然为每种产品提供一条线。我想像上面的例子一样。因为它是更复杂的表连接的开始。
  • 不过,为每个属性设置一列是没有意义的。如果你有一个产品有数百个属性怎么办?你最终会得到数百列。这样,属性只有一列,您可以准确地处理该列。您对结果的处理取决于您的应用程序,但我想不出有一个单独的列会更好的场景,介意扩展您的问题吗?
【解决方案2】:

选择属性 从组合 联合所有 选择属性 FROM 组合

【讨论】:

  • 是的,这个点是一个错字。它们都是下划线。
  • 我尝试了第一个答案,这似乎有效,但实际上它们用逗号分隔。是否可以在单独的列中显示它?
  • Tushar 的答案只有 1 列作为结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多