【发布时间】: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表的列sku和entity_id和entity_id是唯一的。您还有一个表catalog_product_entity_varchar,其中包含entity_id、attribute_id、store_id和value列,其中前三列的组合是唯一的。但是,您只对entity_id和attribute_id和value感兴趣;您不在乎使用哪个store_id来生成值。对吗?