单个MySQL字段,以逗号分隔值

Mot*_*ive 7 mysql sql

可能重复:
mysql是多列中的数组

我有两张桌子:

帖子表

PostID | Gallery
  1    | 4,7,8,12,13
  2    | 1,2,3,4
  3    | 5,8,9
  4    | 3,6,11,14
Run Code Online (Sandbox Code Playgroud)

Gallery中的值是Images表中的主键:

图像表

ImageID | FileName
   1    | something.jpg
   2    | lorem.jpg
   3    | ipsum.jpg
   4    | what.jpg
   5    | why.jpg
Run Code Online (Sandbox Code Playgroud)

我这样做的原因,而不是只是将一个PostID键添加到Images表是因为这些图像可以与很多不同的帖子相关联.我想我可以为关系添加另一个表,但是就我用来添加它的jQuery脚本而言,逗号分隔值更容易使用.

如果我在一个需要与PostID 3相关联的图像的页面上,我可以运行什么样的查询来输出它的所有文件名?

Zan*_*ien 25

您可以使用此解决方案:

SELECT b.filename
FROM posts a
INNER JOIN images b ON FIND_IN_SET(b.imageid, a.gallery) > 0
WHERE a.postid = 3
Run Code Online (Sandbox Code Playgroud)

SQLFiddle

但是,您应该真正规范化您的设计并在帖子和图像之间使用交叉引用表.这将是表示N:M(多对多)关系的最佳和最有效的方式.它不仅更有效地进行检索,而且可以极大地简化更新删除图像关联.


...但是,就我用来添加的jQuery脚本而言,逗号分隔值更容易使用.

即使您使用交叉引用表正确表示N:M关系,您仍然可以获得imageidCSV格式:

假设您有一个posts_has_images包含主键字段(postid,imageid)的表:

您可以使用GROUP_CONCAT()获得的CSV imageid的每个postid:

SELECT postid, GROUP_CONCAT(imageid) AS gallery
FROM posts_has_images
GROUP BY postid
Run Code Online (Sandbox Code Playgroud)

  • +1 对于 GROUP_CONCAT 选项,仍然可以让他以他需要的方式为 jQuery 列出画廊数据。 (2认同)