Rumah  >  Soal Jawab  >  teks badan

SQL Pilih daripada jadual utama - jadual terperinci (data berformat)

Saya mempunyai dua jadual bernama "Pembekal" dan "Kenalan".

Data dalam jadual kenalan sepadan dengan rekod dalam jadual pembekal.

Data pembekal

id Nama
1 Kuasa kuda
2 Huawei

Data hubungan

id ID Pembekal Hubungi
1 1 John
2 1 Smith
3 1 Akan
4 2 Jabatan Tenaga AS
5 2 Wick

Sekarang, saya ingin membuat pertanyaan yang sepatutnya mengembalikan hasil berikut

id Nama Hubungi
1 Kuasa kuda John, Smith, Will
2 Huawei Jabatan Tenaga A.S., Wake

Atau keputusan berikut harus dikembalikan

id Nama Hubungi Hubungi Hubungi
1 Kuasa kuda John Smith Akan
2 Huawei Jabatan Tenaga AS Wick

P粉904191507P粉904191507205 hari yang lalu386

membalas semua(1)saya akan balas

  • P粉124890778

    P粉1248907782024-03-28 09:13:08

    Anda boleh menggunakan MySQL GROUP_CONCAT 聚合函数来获取您的第一个输出表。它自己的 ORDER BY klausa akan membolehkan anda menyemak susunan penyambungan baris.

    SELECT s.ID,
           s.Name,
           GROUP_CONCAT(c.Contact ORDER BY c.id)
    FROM       Supplier s
    INNER JOIN Contact c
            ON s.ID = c.supplierId
    GROUP BY s.ID,
             s.Name

    Anda boleh menggunakan fungsi tetingkap ROW_NUMBER 通过对供应商进行分区来为 Contact 表中的每一行分配排名。然后使用 IF 语句将联系人分成三列,该语句将检查排名的三个可能值。 MAX Fungsi pengagregatan akan membolehkan anda mengalih keluar nilai nol.

    SELECT s.ID,
           s.Name,
           MAX(IF(c.rn = 1, c.Contact, NULL)) AS Contact1,
           MAX(IF(c.rn = 2, c.Contact, NULL)) AS Contact2,
           MAX(IF(c.rn = 3, c.Contact, NULL)) AS Contact3
    FROM       Supplier s
    INNER JOIN (SELECT *, ROW_NUMBER() OVER(PARTITION BY supplierId
                                            ORDER     BY id) AS rn
                FROM Contact ) c
            ON s.ID = c.supplierId
    GROUP BY s.ID,
             s.Name;

    Pertanyaan kedua mungkin tidak berfungsi jika terdapat lebih daripada tiga pelanggan bagi setiap pembekal. Dalam kes ini, anda boleh mengubah suai pertanyaan untuk memasukkan bilangan maksimum pembekal yang mungkin, atau menggunakan pernyataan yang disediakan. Jika anda benar-benar memerlukan penyelesaian sedemikian, sila tinggalkan komen di bawah.

    Untuk pemahaman yang lebih baik, anda boleh menggunakan penyelesaian ini di sini. Penyelesaian pertama berfungsi dengan mana-mana versi MySQL, manakala penyelesaian kedua berfungsi dengan MySQL 8.

    balas
    0
  • Batalbalas