我四处寻找,什么都没有。
我有2个表,并且不必查询数据库中每个显示我需要以某种方式加入它们的帖子。
我想从pics表中获取url
,其中id为pics
字段。现在是我的问题:pics
字段是一个以分隔的“列表”(4,1或32,4,32,2),因为每个帖子通常都有多个图片。
表格设置:
帖子:
id | header | text | pics
| 1 xxx xxx 3,1
| 2 xxx xxx 2,10,4
| 3 xxx xxx 16,17,18,19
| 4 xxx xxx 11,12,13
图片:
id | name | url
| 1 xxx xxx
| 2 xxx xxx
| 3 xxx xxx
| 4 xxx xxx
| 10 xxx xxx
| 11 xxx xxx
| 12 xxx xxx
| 13 xxx xxx
| 16 xxx xxx
| 17 xxx xxx
| 18 xxx xxx
答案 0 :(得分:6)
我强烈建议您修复当前的数据库结构,这样就不会将数据存储在以逗号分隔的列表中。您应该构建类似于以下内容的表:
CREATE TABLE posts
(`id` int, `header` varchar(3), `text` varchar(3))
;
CREATE TABLE pics
(`id` int, `name` varchar(3), `url` varchar(3))
;
CREATE TABLE post_pics
(`post_id` int, `pic_id` int)
;
然后您可以通过加入表格轻松获得结果:
select p.id,
p.header,
p.text,
c.name,
c.url
from posts p
inner join post_pics pp
on p.id = pp.post_id
inner join pics c
on pp.pic_id = c.id;
如果您无法更改表格,那么您应该可以使用FIND_IN_SET
进行查询:
select p.id, p.header, p.text, p.pics,
c.id c_id, c.name, c.url
from posts p
inner join pics c
on find_in_set(c.id, p.pics)
编辑,如果您希望数据显示为以逗号分隔的列表,则可以使用GROUP_CONCAT
。
查询1:
select p.id,
p.header,
p.text,
group_concat(c.name separator ', ') name,
group_concat(c.url separator ', ') url
from posts p
inner join post_pics pp
on p.id = pp.post_id
inner join pics c
on pp.pic_id = c.id
group by p.id, p.header, p.text;
查询2:
select p.id, p.header, p.text, p.pics,
group_concat(c.name separator ', ') name,
group_concat(c.url separator ', ') url
from posts p
inner join pics c
on find_in_set(c.id, p.pics)
group by p.id, p.header, p.text, p.pics;