我有一个包含以下两个表的数据库:
+------------+-------+---------+
| customer_id| name | surname |
+------------+-------+---------+
| 123 | Bob | Johnson |
| 124 | Alice | Smith |
| 125 | Fred | Rogers |
+------------+-------+---------+
+------------+-------------+--------------+------------+
| address_id | customer_id | address_1 | address_2 |
+------------+-------------+--------------+------------+
| 1 | 123 | 123 A Street | Oneville |
| 2 | 124 | 321 B Street | Twoville |
| 3 | 124 | 42 C Street | Threeville |
| 4 | 125 | 23 D Street | Fourville |
+------------+-------------+--------------+------------+
我尝试使用查询将地址表中具有相同客户id的其他行转换为这样的格式,并将额外的地址添加到行中:
+-------------+---------------+--------------+------------+--------------+------------+
| customer_id | customer_name | address_1 | address_2 | address_3 | address_4 |
+-------------+---------------+--------------+------------+--------------+------------+
| 123 | Bob | 123 A Street | Oneville | | |
| 124 | Alice | 321 B Street | Twoville | 42 C Street | Threeville |
| 125 | Fred | 23 D Street | Fourville | | |
+-------------+---------------+--------------+------------+--------------+------------+
当前我的(简化)查询如下所示:
SELECT
c.customer_id,
c.name AS 'customer_name',
a.address_1,
a.address_2,
FROM
customer c
LEFT JOIN
address a ON c.customer_id = a.customer_id
GROUP BY a.customer_id
基于我在这里已经找到的内容,我尝试添加一个子查询来完成这项工作,但我认为我对它们的理解不够好,无法让它按预期的方式工作。
另外,我要感谢这个网站的贡献者让我了解了在此之前导出的极其复杂的产品数据库。网站迁移不是很有趣吗?
1条答案
按热度按时间w3nuxt5m1#
理想情况下,此类与数据显示相关的需求通常应该使用应用程序代码(例如:php、c++、java等)来解决。但是,根据您的评论,您只需要使用sql就可以了。此外,您确认您最多关注一个客户的2个地址。
在mysql版本<8.0.2中,我们可以模拟
Row_Number()
使用用户定义的变量。在派生表中,我们将获得客户的所有地址。在这个子查询中以特定的顺序获取数据是很重要的,这样外部子查询就可以利用它来计算数据分区中的行数值customer_id
正确地。在外部子查询中,我们将使用
CASE..WHEN
表达。在最外层的子查询中,我们将对一组customer_id
.address_1
以及address_2
行号为1时确定;以及address_3
以及address_4
将在行号为2时确定