我不知道我的mysql组\u concat查询有什么问题…你能帮我解决吗?

9cbw7uwe  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(345)

我有一个mysql问题,我想不出解决办法。
我有两张table
表1-[书本]表

book id | categories | title       | 
   1       |    1,3,5   |  Book 1  | 
   2       |    2,4    |  Book 2   | 
   3       |    1,4    |  Book 3   |

表2-[类别]表

category id | category name 
    1       |     Technology
    2       |     Accounting
    3       |     Science
    4       |     Math
    5       |     Chemistry

我需要结果像这样出现
结果

book id    | categories | title       |   category name
   1       |    1,3,5   |  Book 1  |   Technology,Science,Chemistry
   2       |    2,4     |  Book 2   |   Accounting,Math 
   3       |    1,4     |  Book 3   |   Technology,Math

我尝试了下面的查询,但我不确定它出了什么问题。

SELECT DISTINCT t1.*,(SELECT GROUP_CONCAT(t2.categoryName) FROM `tbl_category` t2 WHERE t2.id IN (t1.categories)) catColumn FROM tbl_books t1 ORDER BY t1.id DESC

如果执行以下查询,它将返回所需的正确值:

SELECT GROUP_CONCAT(categoryName) FROM `tbl_category` t2 WHERE t2.id IN (1,3,5)

结果:

Technology,Science,Chemistry
s4n0splo

s4n0splo1#

您的第一项工作应该是修复您的模式。您应该有一个单独的表来存储图书/类别关系,每个元组位于单独的表行中。在数据库表中存储带分隔符的列表是一种糟糕的设计,应该始终避免:有关详细信息,请参阅这个著名的so问题。
不过,对于您当前的设置,我建议使用 find_in_set() :

select
    b.*,
    (
        select group_concat(c.category_name)
        from category c
        where find_in_set(c.id, b.categories)
    ) category_names
from book b
nzkunb0c

nzkunb0c2#

为了回应其他人,我要做的第一件事是对您的表结构做一个小的更改,并将书籍从类别中分离出来,如下所示:

TABLE BOOK

book id | title       | 
   1       |  Book 1  | 
   2       |  Book 2   | 
   3       |  Book 3   | 

TABLE CATEGORY

category id | category name 
    1       |     Technology
    2       |     Accounting
    3       |     Science
    4       |     Math
    5       |     Chemistry

TABLE BOOK_CATEGORY

id | book_id | category_id
1  |   1     |   1
2  |   1     |   3
3  |   1     |   5
4  |   2     |   2
5  |   2     |   4
6  |   3     |   1
7  |   3     |   4

最后,要获得所需的结果,请执行以下查询:

SELECT
   b.book_id,
   group_concat(bc.category_id order by bc.category_id) AS category_id,
   b.title,
   group_concat(c.category_name) AS category_name
FROM 
   book b 
      INNER JOIN 
   book_category bc ON b.book_id = bc.book_id 
      INNER JOIN 
   category c ON c.category_id = bc.category_id 
GROUP BY
   book_id;

相关问题