我有两张表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
它只返回一个类别,它只检索第一个类别名称。
答案 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