我想集成两个SQL函数,以便能够通过单个SQL查询进行prestashop导出:
函数1连接来自不同表的数据。
函数2将多行转换为单行。
我无法让这些功能协同工作...让我描述一下这两个功能。
功能1
SELECT a.id_product, a.ean13, a.weight, b.id_product, b.name, c.id_product, c.id_tab, c.content
FROM ps_product AS a
INNER JOIN ps_product_lang AS b ON b.id_product = a.id_product
INNER JOIN ps_extraproducttab_product_lang AS c ON c.id_product = a.id_product
这些内部联接可以正常工作:
+------------+---------------+-------------+-----------+--------+-------------------+
| id_product | ean13 | weight | name | id_tab | content |
+------------+---------------+-------------+-----------+--------+-------------------+
| 11 | 0000000000001 | 1000.000000 | product_A | 1 | some ingredients |
| 11 | 0000000000001 | 1000.000000 | product_A | 2 | some allergenes |
| 12 | 0000000000002 | 1500.000000 | product_B | 1 | other ingredients |
| 12 | 0000000000002 | 1500.000000 | product_B | 2 | other allergenes |
+------------+---------------+-------------+-----------+--------+-------------------+
但是我想以某种方式转换c。第二个INNER JOIN使用一个表,该表在单个键(id_product)上具有多个行:
+--------+------------+---------+-------------------+
| id_Tab | id_product | id_lang | content |
+--------+------------+---------+-------------------+
| 1 | 11 | 1 | some ingredients |
| 2 | 11 | 1 | some allergenes |
| 1 | 12 | 1 | other ingredients |
| 2 | 12 | 1 | other allergenes |
+--------+------------+---------+-------------------+
我想先合并这些行。在表'ps_extraproducttab_product_lang'上运行此第二个功能确实可以做到这一点:
功能2
SELECT t1.id_product, t1.content AS 'ingred', t2.content AS 'allerg'
FROM ps_extraproducttab_product_lang t1, ps_extraproducttab_product_lang t2
WHERE t1.id_product = t2.id_product
AND t1.id_Tab = '1'
AND t2.id_Tab = '2'
它输出:
+------------+-------------------+------------------+
| id_product | ingred | allerg |
+------------+-------------------+------------------+
| 11 | some ingredients | some allergenes |
| 12 | other ingredients | other allergenes |
+------------+-------------------+------------------+
我使用了由Akina私有的此资源:https ://dba.stackexchange.com/questions/236692/combining-multiple-rows-into-a-single-row-with-multiple-columns (我仍然需要了解如何将此代码扩展到第3个和第4个id_Tab,尽管这不是我当前问题的主题)
我无法将上述内容整合到一个查询中,导致以下结果:
+------------+---------------+-------------+-----------+-------------------+-------------------+
| id_product | ean13 | weight | name | ingred | allerg | |
+------------+---------------+-------------+-----------+-------------------+-------------------+
| 11 | 0000000000001 | 1000.000000 | product_A | some ingredients | some allergenes |
| 12 | 0000000000002 | 1500.000000 | product_B | other ingredients | other allergenes |
+------------+---------------+-------------+-----------+-------------------+-------------------+
你将如何构建一个SQL查询以获得上述结果?
任何帮助表示赞赏!
如果在Prestashop平台上使用最新版本的MySQL / MariaDB,请考虑多个CTE。确保使用显式联接(不是DBA SE链接使用的隐式联接),并避免a,b,c表别名。将自联接扩展到ps_extraproducttab_product_lang
第三和第四类。
WITH ew AS
(SELECT p.id_product, p.ean13, p.weight, pl.name
FROM ps_product AS p
INNER JOIN ps_product_lang AS pl
ON p.id_product = pl.id_product
), ia AS
(SELECT t1.id_product, t1.content AS 'ingred', t2.content AS 'allerg'
, t3.content AS 'thirdcat', t4.content AS 'fourthcat'
FROM ps_extraproducttab_product_lang t1
INNER JOIN ps_extraproducttab_product_lang t2
ON t1.id_product = t2.id_product
AND t1.id_Tab = '1' AND t2.id_Tab = '2'
INNER JOIN ps_extraproducttab_product_lang t3
ON t1.id_product = t3.id_product AND t3.id_Tab = '3'
INNER JOIN ps_extraproducttab_product_lang t4
ON t1.id_product = t4.id_product AND t4.id_Tab = '4'
)
SELECT ew.id_product, ew.ean13, ew.weight, ew.name
, ia.ingred, ia.allerg, ia.thirdcat, ia.fourthcat
FROM ew
INNER JOIN ia
ON ew.id_product = ia.id_product
对于早期版本的MySQL(v8.0之前)或MariaDB(v10.2之前),请使用子查询:
SELECT ew.id_product, ew.ean13, ew.weight, ew.name
, ia.ingred, ia.allerg, ia.thirdcat, ia.fourthcat
FROM
(SELECT p.id_product, p.ean13, p.weight, pl.name
FROM ps_product AS p
INNER JOIN ps_product_lang AS pl
ON p.id_product = pl.id_product
) ew
INNER JOIN
(SELECT t1.id_product, t1.content AS 'ingred', t2.content AS 'allerg'
, t3.content AS 'thirdcat', t4.content AS 'fourthcat'
FROM ps_extraproducttab_product_lang t1
INNER JOIN ps_extraproducttab_product_lang t2
ON t1.id_product = t2.id_product
AND t1.id_Tab = '1' AND t2.id_Tab = '2'
INNER JOIN ps_extraproducttab_product_lang t3
ON t1.id_product = t3.id_product AND t3.id_Tab = '3'
INNER JOIN ps_extraproducttab_product_lang t4
ON t1.id_product = t4.id_product AND t4.id_Tab = '4'
) ia
ON ew.id_product = ia.id_product
多谢您介入!我在两种解决方案上均遇到错误:MySQL说:#1060-列名'id_product'重复。这些phpmyadmin详细信息有帮助吗?服务器类型:MariaDB,服务器版本:10.3.27-MariaDB-MariaDB服务器,协议版本:10,数据库客户端版本:libmysql-5.6.43,PHP扩展名:mysqli curl mbstring,PHP版本:7.3.6
请再试一次。我
id_product
在ew
结果集中多余地包含了两个引用。冻糕,像你这样的人使互联网值得!谢谢,这有效。我将研究您的答案,并更好地理解MySQL。
哈哈...很好听,很高兴为您提供帮助和愉快的编码!顺便说一句-从技术上讲,您正在使用MySQL的表亲MariaDB(均由同一创建者创建,其女儿分别名为My和Maria),因此MariaDB使用许多MySQL编码API,例如PHP的prestashop。因此,请务必在您的SQL学习中使用MariaDB文档。
可选:如果要输出空t#.id_Tab为NULL的行,则将'... ew INNER JOIN(SELECT ...')更改为'... ew LEFT JOIN(SELECT ...')