簡體   English   中英

SQL JOIN作為單行,子值作為列,並具有ORDER BY子關系值的能力

[英]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.

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