如何匹配两个列表中的SQL结果并为找到的每个匹配插入一个新行?

时间:2017-12-12 18:24:51

标签: php mysql magento magento-1.9

对于那些熟悉Magento的人,我试图编写一个查询来在catalog_product_link表中创建新的加售项,但是有一些独特的标准。我对MySQL(或任何SQL)的了解至多是基本的。

我在表中有两种类型的产品,我可以通过加入其他一些表来唯一识别。我可以得到两种类型的产品结果的唯一列表,如下所示:

SELECT cpev.entity_id AS product_id, cpev.value AS name
FROM catalog_product_entity_varchar AS cpev

INNER JOIN catalog_product_entity AS cpe
ON cpe.entity_id = cpev.entity_id

INNER JOIN eav_attribute AS ea
ON ea.attribute_id = cpev.attribute_id

INNER JOIN catalog_category_product AS cat
ON cat.product_id = cpev.entity_id

WHERE cat.category_id IN ( 41 )
AND ea.attribute_code = 'name'

GROUP BY product_id
ORDER BY product_id;

...两个结果列表基于更改WHERE cat.category_id IN ( 41 )

我尝试做的是将第一个结果列表中的一行与基于名称的第二个列表中的一行或多行匹配。第一个列表中的全名将匹配第二个列表中名称的第一部分加上一些文本;例如:

  • list1,名称:Afinia L801
  • list2,名称:Afinia L801现场维护 合同

对于每个匹配,我需要在不同的表中插入一个新行,如下所示:

INSERT INTO catalog_product_link (product_id, linked_product_id, link_type_id)
SELECT @idFromList1 AS product_id, @idFromList2 as linked_product_id, 4 as link_type_id
...

我不确定这是否只能用SQL完成,或者如果我需要编写(例如)PHP脚本来从db中提取两个列表,匹配他们了,然后插入结果。但是我还在学习SQL,所以我试图更好地掌握我只能通过MySQL查询做些什么。

1 个答案:

答案 0 :(得分:0)

您可以从同一张桌子中选择两次。

SELECT cpev.entity_id AS product_id, cpev.value AS name
FROM catalog_product_entity_varchar AS cpev
INNER JOIN catalog_product_entity AS cpe
ON cpe.entity_id = cpev.entity_id
INNER JOIN eav_attribute AS ea
ON ea.attribute_id = cpev.attribute_id
INNER JOIN catalog_category_product AS cat
ON cat.product_id = cpev.entity_id
INNER JOIN catalog_category_product AS cat2
ON cat2.product_id = cpev.entity_id
WHERE cat.category_id IN ( 41 )
AND cat2.category_id IN ( 42 )
AND ea.attribute_code = 'name'
GROUP BY product_id
ORDER BY product_id;