列表id中的mysql查询名称

时间:2013-04-05 06:38:15

标签: php mysql sql group-by

我在这里遇到一点问题...... 让我解释..

假设我有一张这样的桌子......

╔══════════╦════════════╦════════════╗
║ IDBARANG ║    NAMA    ║ IDKATEGORI ║
╠══════════╬════════════╬════════════╣
║        1 ║ Ban Becak  ║ 1,3        ║
║        2 ║ Velg Becak ║ 2,4        ║
╚══════════╩════════════╩════════════╝

驾驶员学校

╔════════════╦══════════════╗
║ IDKATEGORI ║ NAMAKATEGORI ║
╠════════════╬══════════════╣
║          1 ║ Ban Dalam    ║
║          2 ║ Velg Canggih ║
║          3 ║ Ban Keren    ║
║          4 ║ Velg Monster ║
╚════════════╩══════════════╝

我的问题是......如何获取,结果就像这样

╔══════════╦════════════╦═══════════════════════════╗
║ IDBARANG ║    NAMA    ║        IDKATEGORI         ║
╠══════════╬════════════╬═══════════════════════════╣
║        1 ║ Ban Becak  ║ Ban Keren,Ban Dalam       ║
║        2 ║ Velg Becak ║ Velg Monster,Velg Canggih ║
╚══════════╩════════════╩═══════════════════════════╝

我尝试使用FIND_IN_SET但什么都没有......

感谢您的帮助...

3 个答案:

答案 0 :(得分:4)

使用FIND_IN_SET()

时,可能您错过了其他内容
SELECT  a.idBarang,
        a.nama,
        GROUP_CONCAT(b.namaKategori) idKategori
FROM    barang a
        INNER JOIN Kategori b
            ON FIND_IN_SET(b.idKategori, a.idKategori)
GROUP   BY a.idBarang, a.nama

输出

╔══════════╦════════════╦═══════════════════════════╗
║ IDBARANG ║    NAMA    ║        IDKATEGORI         ║
╠══════════╬════════════╬═══════════════════════════╣
║        1 ║ Ban Becak  ║ Ban Keren,Ban Dalam       ║
║        2 ║ Velg Becak ║ Velg Monster,Velg Canggih ║
╚══════════╩════════════╩═══════════════════════════╝

现在要做的理想事情是规范化表格。将值以逗号分隔值存储在单个列中是一种不好的做法。如果这是Many-to-Many关系,请将当前设计转换为三表数据库。

<强>啷

  • idBarang(PK)
  • 名称

<强>驾驶员学校

  • idkategori(PK)
  • namaKategori

<强> Barang_Kategori

  • idBarang(FK)
  • idkategori(FK)

样本记录

<强>啷

╔══════════╦════════════╗
║ IDBARANG ║    NAMA    ║
╠══════════╬════════════╣
║        1 ║ Ban Becak  ║
║        2 ║ Velg Becak ║
╚══════════╩════════════╝

<强>驾驶员学校

╔════════════╦══════════════╗
║ IDKATEGORI ║ NAMAKATEGORI ║
╠════════════╬══════════════╣
║          1 ║ Ban Dalam    ║
║          2 ║ Velg Canggih ║
║          3 ║ Ban Keren    ║
║          4 ║ Velg Monster ║
╚════════════╩══════════════╝

<强> Barang_Kategori

╔══════════╦════════════╗
║ IDBARANG ║ IDKATEGORI ║
╠══════════╬════════════╣
║        1 ║          1 ║
║        1 ║          3 ║
║        2 ║          2 ║
║        2 ║          4 ║
╚══════════╩════════════╝

NEW QUERY

SELECT  a.idBarang,
        a.nama,
        GROUP_CONCAT(c.namaKategori) KategoryLista
FROM    barang a
        INNER JOIN Barang_Kategori b
            ON a.idBarang = b.idBarang
        INNER JOIN Kategori c
            ON b.idKategori = c.idKategori
GROUP   BY a.idBarang, a.nama

答案 1 :(得分:0)

您需要在查询中使用JOIN。这是关于这个主题的教程:

http://www.sitepoint.com/understanding-sql-joins-mysql-database/

答案 2 :(得分:-1)

我不知道这个查询是否有效,如果出现错误,请仔细检查:

SELECT Barang . idBarang , Barang . Nama , Kategori . namaKategori AS `idKategori`
FROM Barang
INNER JOIN Kategori ON Barang . idKategori = Kategori . idKategori
ORDER BY Barang . idBarang

但如果Barang . idKategori上的数字与代码中的最底层表格分开,则上面查询的输出将是下表,无论如何您仍然可以尝试上面的代码:

idBarang | Nama | idKategori
-----------------------------------
1. | Ban Becak | Ban Dalam
1. | Ban Becak | Ban Keren
2. | Velg Becak| Velg Canggih
2. | Velg Becak| Velg Monster

如果查询不起作用。只是在您想要这样做时,尝试将Barang . idKategori上的数字分开,如下所示!当然它会像上面的表一样工作。

Barang
---------------
idBarang | Nama | idKategori
-------------------------------
1 | Ban Becak | 1
1 | Ban Becak | 3
2 | Velg Becak | 2
2 | Velg Becak | 4