【问题标题】:Group concat limit 1组连接限制 1
【发布时间】:2012-02-06 15:15:58
【问题描述】:

这是我的组连接查询

GROUP_CONCAT(DISTINCT IF(catalog_product_entity_varchar.attribute_id = '134',catalog_product_entity_varchar.value,NULL)) AS 'Subtitle'

该表包含多行,属性 id 为 134。我真正想做的就是拉第一个 catalog_product_entity_varchar.value WHERE catalog_product_entity_int.attribute_id=134

完整的SQL如下

SELECT catalog_product_entity.sku AS SKU,
    IF(catalog_product_entity_decimal.attribute_id = '67',catalog_product_entity_decimal.value,NULL) AS 'Price',
    GROUP_CONCAT(DISTINCT IF(catalog_product_entity_int.attribute_id = '146',catalog_product_entity_int.value,NULL)) AS 'Brand',
    GROUP_CONCAT(DISTINCT IF(catalog_product_entity_varchar.attribute_id = '63',catalog_product_entity_varchar.value,NULL)) AS 'Name',
    GROUP_CONCAT(DISTINCT IF(catalog_product_entity_varchar.attribute_id = '134',catalog_product_entity_varchar.value,NULL)) AS 'Subtitle'
FROM catalog_product_entity
    JOIN catalog_product_entity_decimal ON catalog_product_entity_decimal.entity_id = catalog_product_entity.entity_id
    JOIN catalog_product_entity_int ON catalog_product_entity_int.entity_id = catalog_product_entity.entity_id
    JOIN catalog_product_entity_varchar ON catalog_product_entity_varchar.entity_id = catalog_product_entity.entity_id          
WHERE catalog_product_entity.type_id='simple' AND catalog_product_entity.sku='30020262'
GROUP by catalog_product_entity.entity_id

编辑:试图让事情更清晰。

我正在提取产品数据。为了使事情变得更容易,请尝试忽略大部分查询。我们将只关注“sku”和“副标题”。

第一个表catalog_product_entity。我们正在为每种产品提供 SKU。还有一个唯一的“entity_id”。

当我们想从另一个名为 catalog_product_entity_varchar 的表中提取此产品的所有相关详细信息时,我们使用“entity_id”。

属性 id 指的是您想要的特定信息。 134是字幕,63是名字。还有其他“属性”,每个属性都有一个 id。

我使用了一个 IF 语句来允许我将 134 分配给“副标题”,将 63 分配给“名称”。表格看起来像这样。

entity_id   attribute_id   store_id   value
1                134         0        green, large
1                134         1        green, large
1                134         2        green, large
1                63          0        dakine day hiker bag
1                63          1        dakine day hiker bag
1                63          2        dakine day hiker bag

请注意,一个产品似乎将相同的字幕存储了 3 次。这是因为我使用的电子商务平台(Magento)允许您为您正在运行的每个商店存储不同的字幕(一个 Magento 安装允许多个域共享相同的产品数据库,但具有单独的字幕/描述等)

我使用 Group_Concat 来抓取数据,然后使用 DISTINCT 来确保我只抓取一个字幕。但是我面临的问题是,大多数时候我的字幕和名称在所有商店中都是完全相同的(所以 Distinct 有效),但是当有不同的字幕时,distinct 会抓取多个字幕。

老实说,我对 MYSQL 不是很好,我觉得我可能会以某种方式完全省略 group_concat,也许使用嵌套的 SQL 语句。请记住,我们并不总是知道产品将使用什么商店 ID。

我真的不在乎我抓住哪个字幕,我只想要一个,第一个,最小的,最大的。随便。

【问题讨论】:

  • 您至少需要为显示的 4 个表提供足够的架构,以便理解它,包括 PK/FK 约束。您对内部连接的使用使得每个 catalog_product_entity 似乎在每个子类型中都必须有一行;你确定你不需要 OUTER JOIN 吗?但无论如何,如果你想要你所说的,你只需加入两张桌子。不过,您必须定义“第一”。
  • 实体ID栏是否正确?最后 3 行的实体 ID 是否应该与前 3 行不同?所有 6 行都应该有不同的实体 ID 吗?
  • 没错,它是一种产品。 2 个属性(副标题、名称)。并且该产品出现在 3 个商店中(在本例中),每个商店可能为一个产品拥有不同的名称和副标题(在本例中,该产品的所有商店的名称和副标题都相同)
  • 好的;我开始看穿森林......我认为不能保证每个商店都代表特定的实体 ID,因此您可能在商店 2、3 中拥有实体 ID 12345,而实体 ID 1 出现在商店中0,1,2,所以你不能只选择一个商店号码来简化事情吗?您能否强制要求所有实体都必须在商店 0 中,即使运营商店不携带所有物品?也许没关系……
  • 我们可以推断出catalog_product_entity 表的列skuentity_identity_id 是唯一的。您还有一个表catalog_product_entity_varchar,其中包含entity_idattribute_idstore_idvalue 列,其中前三列的组合是唯一的。但是,您只对entity_idattribute_idvalue 感兴趣;您不在乎使用哪个store_id 来生成值。对吗?

标签: mysql magento


【解决方案1】:

你说:

该表包含多行,属性 id 为 146。我真正想做的就是拉第一个 catalog_product_entity_int.value WHERE catalog_product_entity_int.attribute_id=146。

你说你想要的实现:

SELECT Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146;

这可能会返回多个值,因此您必须定义“第一个”的含义;它可以是 MIN、MAX、LIMIT 1 或其他一些标准。

SELECT MIN(Value) AS Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146;

SELECT MAX(Value) AS Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146;

SELECT Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146
 LIMIT 1;

对于你所说的你想要的,我认为没有理由加入其他三个表或使用 GROUP_CONCAT。

这让我怀疑你没有告诉我们你真正想要什么,因为显示的查询对于所述要求来说过于夸张了。

【讨论】:

  • 我用更多信息编辑了我的原始帖子,希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多