如何将所有类别逗号与此查询分开

时间:2017-08-15 04:27:35

标签: mysql

我有两张表Posts, categories。在posts表中,我将类别值存储为逗号分隔的字符串,如5,8,23,7。在显示帖子时,我只想将帖子类别显示为逗号分隔,如Flower, Birds, Animals。所以我尝试了一些查询,没有任何帮助我得到它。帖子表示例。

ID  Post title      categories
3   Example Post     5,7,23,8

类别表将是这样的

ID   name  
5    Flowers
7    Animals
8    Birds
23   Naturals

我想要这样的结果

ID  Post Tile        Category
3   Example Post     Flowers, Animals, Birds

为此我尝试了这个查询,但没有帮助我得到它。

SELECT post.ID, post.Post_title, (SELECT cat.name FROM Categories as cat WHERE cat.ID IN (post.category)) AS Categories FROM Posts as post 

它只返回一个类别,它只检索第一个类别名称。

3 个答案:

答案 0 :(得分:1)

如果您只是必须使用该架构,您可以尝试这样的事情:

select P.ID, P.Title, (
       select group_concat(C.name SEPARATOR ', ')
       from Categories C
       where LOCATE(CONCAT(C.ID, ','), P.categories) > 0
          or LOCATE(CONCAT(', ', C.ID), P.categories) > 0
) as categories
from Post P;

这很麻烦,因为在逗号分隔列表中,值可以出现在逗号之前或逗号之后,同时考虑列表开头或结尾的值。你不能只做一个直的子串,因为否则你会得到一个类别ID为5的'类别'值'1,2,555'。

答案 1 :(得分:0)

我相信你可以使用group_concat吗?只需加入Categories表和group_concat名称group_concat(name)

即可

至于JOIN尝试使用find_in_set(Categories.ID,Post.ID)> 0

如果以逗号分隔的类别ID具有空格,即1,2等,则此方法可能无效。但如果您准确保存它,则可能有效。

答案 2 :(得分:0)

编辑:已更新,以考虑Posts.categories是CSV值的事实。

您需要使用GROUP_CONCAT()功能以及SQL split comma separated row中发布的技巧,以便分割JOIN CSV,然后创建输出CSV:

SELECT
    Posts.ID,
    Posts.Post_title,
    GROUP_CONCAT(Categories.name SEPARATOR ',') AS `Category`
FROM Posts
INNER JOIN Categories
    ON Categories.ID IN (
        SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(Posts.categories, ',', n.n), ',', -1) value
        FROM (
            SELECT a.N + b.N * 10 + 1 n
            FROM
            (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
            ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
            ORDER BY n
        ) n
        WHERE n.n <= 1 + (LENGTH(Posts.categories) - LENGTH(REPLACE(Posts.categories, ',', '')))
        ORDER BY value
    )
GROUP BY
    Posts.ID,
    Posts.Post_title

小提琴:http://sqlfiddle.com/#!9/b1ddc9/4