簡體   English   中英

如何將表格加入此結果?

[英]How do I join a table to this result?

我有一個表作為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

編輯#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

結果:

| 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 ,請用JP替換US

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

我認為嘗試賦予表之間的關系,然后重試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM