gpt4 book ai didi

php - 如何将表连接到此结果?

转载 作者:行者123 更新时间:2023-11-29 14:05:58 25 4
gpt4 key购买 nike

我有一个 T1 表和 T2 表,如下所示:

T1

-------------------------------------------------------
id | price | email
-------------------------------------------------------
1 | $1000 | jacky@domain.com
2 | $2000 | angle@domain.com
3 | $3000 | kevin@domain.com
-------------------------------------------------------

T2

-------------------------------------------------------
id | master | country | key | value
-------------------------------------------------------
1 | 1 | US | price | $399
2 | 1 | US | email | jacky/domain.us
3 | 1 | ES | price | $550
4 | 1 | ES | email | jacky@domain.es
5 | 1 | JP | price | $820
6 | 1 | JP | email | jacky@domain.jp
7 | 2 | US | price | $360
8 | 2 | US | email | angle@domain.us
-------------------------------------------------------

如何得到这个结果:

T3

----------------------------------------------------------------------------------------------------------------------------
id | price | price_US | price_ES | price_JP | email | email_US | email_ES | email_JP
----------------------------------------------------------------------------------------------------------------------------
1 | $1000 | $399 | $550 | $820 | jacky@domain.com | jacky@domain.us | jacky@domain.es | jacky@domain.jp
1 | $2000 | $360 | NULL | NULL | angle@domain.com | angle@domain.us | NULL | NULL
1 | $3000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL
----------------------------------------------------------------------------------------------------------------------------

或者我可以用 PHP 得到这个结果吗?

T4

-------------------------------------------------------
id | price | email | more_info
-------------------------------------------------------
1 | $1000 | jacky@domain.com | [array (rows...)]
2 | $2000 | angle@domain.com | [array (rows...)]
3 | $3000 | kevin@domain.com | [array (rows...)]
-------------------------------------------------------

有什么想法吗?

编辑1

或者我可以得到如下结果吗?

T5(美国国家/地区的结果)

-------------------------------------------------------
id | price | email
-------------------------------------------------------
1 | $399 | jacky@domain.us
2 | $360 | angle@domain.us
3 | $3000 | kevin@domain.com
-------------------------------------------------------

T6(日本国家成绩)

-------------------------------------------------------
id | price | email
-------------------------------------------------------
1 | $820 | jacky@domain.jp
2 | $2000 | angle@domain.com
3 | $3000 | kevin@domain.com
-------------------------------------------------------

最佳答案

这种类型的数据转换是一个枢轴。 MySQL 没有枢轴函数,但您可以使用带有 CASE 表达式的聚合函数来复制它:

select t1.id,
t1.price,
max(case when t2.country = 'US' and `key` = 'price' then t2.value end) Price_US,
max(case when t2.country = 'ES' and `key` = 'price' then t2.value end) Price_ES,
max(case when t2.country = 'JP' and `key` = 'price' then t2.value end) Price_JP,
t1.email,
max(case when t2.country = 'US' and `key` = 'email' then t2.value end) Email_US,
max(case when t2.country = 'ES' and `key` = 'email' then t2.value end) Email_ES,
max(case when t2.country = 'JP' and `key` = 'email' then t2.value end) Email_JP
from table1 t1
left join table2 t2
on t1.id = t2.master
group by t1.id, t1.price, t1.email

参见SQL Fiddle with Demo

编辑#1,如果您只想使用联接而不是聚合函数,那么您的查询将类似于以下内容:

select t1.id,
t1.price,
P_US.value Price_US,
P_ES.value Price_ES,
P_JP.value Price_JP,
t1.email,
E_US.value Email_US,
E_ES.value Email_ES,
E_JP.value Email_JP
from table1 t1
left join table2 P_US
on t1.id = P_US.master
and P_US.country = 'US'
and P_US.`key` = 'price'
left join table2 P_ES
on t1.id = P_ES.master
and P_ES.country = 'ES'
and P_ES.`key` = 'price'
left join table2 P_JP
on t1.id = P_JP.master
and P_JP.country = 'JP'
and P_JP.`key` = 'price'
left join table2 E_US
on t1.id = E_US.master
and E_US.country = 'US'
and E_US.`key` = 'email'
left join table2 E_ES
on t1.id = E_ES.master
and E_ES.country = 'ES'
and E_ES.`key` = 'email'
left join table2 E_JP
on t1.id = E_JP.master
and E_JP.country = 'JP'
and E_JP.`key` = 'email'

参见SQL Fiddle with Demo

结果:

| ID | PRICE | PRICE_US | PRICE_ES | PRICE_JP |            EMAIL |        EMAIL_US |        EMAIL_ES |        EMAIL_JP |
------------------------------------------------------------------------------------------------------------------------
| 1 | 1000 | 399 | 550 | 820 | jacky@domain.com | jacky/domain.us | jacky@domain.es | jacky@domain.jp |
| 2 | 2000 | 360 | (null) | (null) | angle@domain.com | angle@domain.us | (null) | (null) |
| 3 | 3000 | (null) | (null) | (null) | kevin@domain | (null) | (null) | (null) |

编辑 #2:要获得类似于 T5T6 的结果,您将使用以下内容。对于 T6,将 US 替换为 JP:

select t1.id,
max(case when `key` = 'price' then value end) price,
max(case when `key` = 'email' then value end) email
from table1 t1
left join table2 t2
on t1.id = t2.master
where t2.country = 'US'
group by t1.id
union all
select t1.id,
t1.price,
t1.email
from table1 t1
where not exists (select t.id
from table1 t
left join table2 t2
on t.id = t2.master
where t2.country = 'US'
and t1.id = t.id);

参见SQL Fiddle with Demo

关于php - 如何将表连接到此结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com