我有两个表格滑块和图库。在图库中,我将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
。除了我想创建的状态之外,其余部分都来自滑块表。
答案 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`;