检查图像的id是否存在于另一个表中用逗号分隔的列表中

时间:2014-03-09 05:34:43

标签: mysql

我有两个表格滑块和图库。在图库中,我将id上传的图片作为主键。我正在创建一个滑块,当我创建一个滑块并选择图像时,它会将images_ids内滑块表中为该滑块选择的图像ID存储为以逗号分隔的列表。现在问题是我想进行一个查询,其中我得到所有的图像,我指定我的滑块ID,如果该图像在我的滑块ID,它说现在和其他不说不。我为我的表和示例数据添加了一个sql小提琴。请建议我如何实现这一目标。

我期望的输出是这样的

image_id slider_id images_id   status


  1         1        1,4       present

  2         1        1,4        not 

  3         1        1,4        not 

  4         1        1,4       present 

上方的image_id来自画廊表,其中id。除了我想创建的状态之外,其余部分都来自滑块表。

我的sqlfiddle

1 个答案:

答案 0 :(得分:0)

当gallery.id进入青少年时,以下查询类型的作品 BUT 会给您带来问题。例如,gellery.id为1,slider.images_id包含11,12,13等。

SELECT
 `gallery`.`id` AS image_id
 ,`sliders`.`id` AS slider_id
 ,`sliders`.`images_id`
 ,(CASE
    WHEN instr(`sliders`.`images_id`,`gallery`.`id`) != 0 THEN 'present'
    ELSE 'not'
   END)AS status
FROM `gallery`, `sliders`

你可以通过用images包围images_id中的每个ID来解决这个问题,然后在case语句中添加,作为围绕image_id的分隔符:

INSERT INTO `sliders` (`id`, `name`, `images_id`, `creation_date`)
VALUES (4, 'Hello', ',5,6,', '1394233227');

instr(`sliders`.`images_id`,CONCAT(',',`gallery`.`id`,','))

HOWEVER ,这可能不太理想。我想你最好在两个现有表之间使用一个表来定义多对多的关系(一个图像可以在很多滑块中,一个滑块可以有很多图像)。

CREATE TABLE IF NOT EXISTS `gallery_sliders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gallery_id` int(11) NOT NULL,
  `slider_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

INSERT INTO `gallery_sliders` (`gallery_id`, `slider_id`) VALUES
(5,4),
(6,4),
(5,6),
(6,6),
(2,7),
(1,7);

SELECT
 `gallery`.`id`
 ,`gallery`.`image_url`
 ,`sliders`.`id`
 ,`sliders`.`name`
 ,`sliders`.`creation_date`
FROM `sliders`
INNER JOIN `gallery_sliders` ON `sliders`.`id` = `gallery_sliders`.`slider_id`
INNER JOIN `gallery` ON `gallery`.`id` = `gallery_sliders`.`gallery_id`
ORDER BY `gallery`.`id`, `sliders`.`id`;