![](/img/trans.png)
[英]SQL join to join values in primary table with child table values as different columns in a single row
[英]SQL JOIN as single row with child values as columns and ability to ORDER BY child relationship value
我不知道這是什么正確的定義,但是它比常規的關系連接更具動態性。
聯系方式:
id, first_name, last_name
字段:
id, handle, type
field_values:
id, field_id, contact_id, value
表字段在這方面不是那么重要,但是想要提供上下文。
聯系人表示例:
id first_name last_name
-- ----- --------
1 John Doe
2 Jane Smith
字段值表示例:
id contact_id field_id value
-- ----- -------- ------
1 1 1 Boston
2 1 2 johndoe@mail.com
3 2 1 Seattle
3 2 2 janesmith@mail.com
在此基本示例中,您可以看到有2個字段,一個字段用於位置(波士頓,西雅圖),另一個字段用於電子郵件。 當我將它們放入JOIN查詢時,它們看起來像這樣
SELECT * FROM contacts LEFT JOIN field_values ON contacts.id = field_values.contact_id;
聯系人JOIN字段值表的示例:
id first_name last_name field_id value
-- ----- -------- ------ -------
1 John Doe 1 Boston
1 John Doe 2 johndoe@mail.com
2 Jane Smith 1 Seattle
2 Jane Smith 2 janesmith@mail.com
兩個問題:
1)如何按字段值排序。 因此,我想通過字段ID = 2的字段電子郵件進行訂購。
2)是否可以為每個聯系人和每個字段值獲得一行作為新列?
示例:每個聯系人單行?
id first_name last_name field_id(2) field_id(1)
-- ----- -------- ------ -------
1 John Doe johndoe@mail.com Boston
2 Jane Smith janesmith@mail.com Seattle
每個聯系人單行:
SELECT
contacts.id,
contacts.first_name,
contacts.last_name,
GROUP_CONCAT(IF(field_values.field_id = 2, field_values.value, NULL)) AS email,
GROUP_CONCAT(IF(field_values.field_id = 1, field_values.value, NULL)) AS field_1
FROM contacts
LEFT JOIN field_values ON contacts.id = field_values.contact_id
GROUP BY contacts.id
ORDER BY email;. -- it is optional, only include if you want to sort result by ascending emails.
您可以在此處使用數據透視邏輯將電子郵件和城市顯示為單獨的列:
SELECT
c.id,
c.first_name,
c.last_name,
MAX(CASE WHEN fv.field_id = 2 THEN fv.value END) AS email,
MAX(CASE WHEN fv.field_id = 1 THEN fv.value END) AS city
FROM contacts c
LEFT JOIN field_values fv
ON c.id = fv.contact_id
GROUP BY
c.id,
c.first_name,
c.last_name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.