MYSQL连接逗号分隔查询

MYSQL连接逗号分隔查询,mysql,database,join,Mysql,Database,Join,我到处找了找,什么也没找到 我有两个表,不必为每一篇显示我需要以某种方式加入它们的帖子查询数据库 我想从pics表中获取url,该表具有posts表中pics字段的id。现在我的问题来了:pics字段是一个逗号分隔的“列表”(4,1或32,4,32,2),因为每个帖子通常都有多张图片 表格设置: 职位: id | header | text | pics | 1 xxx xxx 3,1 | 2 xxx xxx 2,10,4 | 3

我到处找了找,什么也没找到

我有两个表,不必为每一篇显示我需要以某种方式加入它们的帖子查询数据库

我想从pics表中获取
url
,该表具有posts表中
pics
字段的id。现在我的问题来了:
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        
图片:


强烈建议您修复当前的数据库结构,这样您就不会将数据存储在逗号分隔的列表中。表的结构应类似于以下内容:

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\u IN\u 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\u 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;

请参见

I强烈建议您修复当前的数据库结构,这样您就不会将数据存储在逗号分隔的列表中。表的结构应类似于以下内容:

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\u IN\u 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\u 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;


请参见

为什么要存储需要加入的逗号分隔列表?请规范化该表结构。步骤1:重新设计该表,使其正确规范化。步骤2)标准化后,使用普通的常规连接查询。如果
pics
CSV列表可以作为一个单独的表,请将数据标准化。如果图片只出现在一篇文章中,那么在
pics
表中添加
post\u id
键就足够了。还有许多类似的问题。例如,等等……为什么要存储需要加入的逗号分隔列表?请规范化该表结构。步骤1:重新设计该表,使其正确规范化。步骤2)标准化后,使用普通的常规连接查询。如果
pics
CSV列表可以作为一个单独的表,请将数据标准化。如果图片只出现在一篇文章中,那么在
pics
表中添加
post\u id
键就足够了。还有许多类似的问题。感谢您的快速回复,但在这两种情况下,它都会返回每张图片的所有内容(标题、文本、url等)。在你的第一把小提琴中,有两个1和树3等。我采纳了你的建议,按照你的建议构建了我的数据库,但我需要一行中一篇文章的所有url。你希望得到什么样的结果?如果您希望数据以逗号分隔的列表显示,请参阅我使用
group\u concat
进行的编辑。是的,我在谷歌上查看了一下,但我无法让它工作。但是你的代码帮助了我,非常感谢,我的问题已经解决了。一个简单的问题是,如果没有图片,这篇文章就不会显示。谢谢你的支持time@RobinSandström如果你想返回所有帖子,即使是没有图片的帖子,也可以使用左连接而不是内部连接。谢谢你的快速响应,但在这两种情况下,它都会返回每张图片的所有内容(标题、文本、url等)。在你的第一把小提琴中,有两个1和树3等。我采纳了你的建议,按照你的建议构建了我的数据库,但我需要一行中一篇文章的所有url。你希望得到什么样的结果?如果您希望数据以逗号分隔的列表显示,请参阅我使用
group\u concat
进行的编辑。是的,我在谷歌上查看了一下,但我无法让它工作。但是你的代码帮助了我,非常感谢,我的问题已经解决了。一个简单的问题是,如果没有图片,这篇文章就不会显示。谢谢你的支持time@RobinSandström如果您想返回所有帖子,甚至是没有图片的帖子,请使用左连接而不是内部连接。