如何组合 2 MySQL-函数
How to combine 2 MySQL-functions
我有两个 SQL 函数,我想将它们集成到能够使用单个 SQL 查询进行 prestashop 导出的功能中:
函数 1 连接来自不同 tables 的数据。
函数 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
这些 INNER JOINS 工作正常:
+------------+---------------+-------------+-----------+--------+-------------------+
| 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 使用 table,它在单个键 (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 |
+--------+------------+---------+-------------------+
我想先合并这些行。
运行 table '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-查询来获得上述结果?
感谢任何帮助!
考虑多个 CTEs if using latest versions of MySQL/MariaDB to your Prestashop platform. Be sure to use explicit joins (not implicit as DBA SE link uses) and avoid a, b, c table aliasing。将第 3 类和第 4 类的自连接扩展到 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
我有两个 SQL 函数,我想将它们集成到能够使用单个 SQL 查询进行 prestashop 导出的功能中:
函数 1 连接来自不同 tables 的数据。
函数 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
这些 INNER JOINS 工作正常:
+------------+---------------+-------------+-----------+--------+-------------------+
| 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 使用 table,它在单个键 (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 |
+--------+------------+---------+-------------------+
我想先合并这些行。 运行 table '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-查询来获得上述结果?
感谢任何帮助!
考虑多个 CTEs if using latest versions of MySQL/MariaDB to your Prestashop platform. Be sure to use explicit joins (not implicit as DBA SE link uses) and avoid a, b, c table aliasing。将第 3 类和第 4 类的自连接扩展到 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