SELECT a.id,i.* FROM ads a
INNER JOIN images i ON i.ad_id=a.id
GROUP BY a.id
LIMIT 10
无法弄清楚如何在图像表中选择带有“main”标志的图像。
对于一个a.id,最多可以在图像表内拍摄3张照片,其中一张照片可以有一个字段main = 1。我需要按照优先级选择照片,其中flag main设置为1。
CREATE DATABASE IF NOT EXISTS `test123`;
USE `test123`;
CREATE TABLE IF NOT EXISTS `ads` (
`id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=229 DEFAULT CHARSET=utf8;
INSERT INTO `ads` (`id`) VALUES (217), (225), (226), (228);
CREATE TABLE IF NOT EXISTS `images` (
`image_id` int(10) NOT NULL AUTO_INCREMENT,
`ad_id` int(10) DEFAULT '0',
`main` int(10) DEFAULT '0',
`t_0` varchar(255) DEFAULT '0',
`t_1` varchar(255) DEFAULT '0',
`t_8` varchar(255) DEFAULT '0',
PRIMARY KEY (`image_id`),
KEY `ad_id` (`ad_id`),
KEY `t_0` (`t_0`),
KEY `t_1` (`t_1`),
KEY `t_8` (`t_8`),
KEY `main` (`main`)
) ENGINE=MyISAM AUTO_INCREMENT=425 DEFAULT CHARSET=utf8;
INSERT INTO `images` (`image_id`, `ad_id`, `main`, `t_0`, `t_1`, `t_8`) VALUES
(1, 226, 0, 'img_link1', 'img_link2', 'img_link3'),
(2, 228, 0, 'img_link1', 'img_link2', 'img_link3'),
(3, 225, 0, 'img_link1', 'img_link2', 'img_link3'),
(4, 217, 0, 'img_link1', 'img_link2', 'img_link3'),
(5, 217, 1, 'img_link1', 'img_link2', 'img_link3'),
(6, 217, 0, 'img_link1', 'img_link2', 'img_link3');
类似的东西,但每个ads.id只有一行。
SELECT a.id, i.main AS main
FROM images i
LEFT JOIN ads a ON a.id=i.ad_id
WHERE i.main=1 OR i.main=0
需要输出:
id | main | links 217 | 1 | ... 225 | 0 | ... 226 | 0 | ... 228 | 0 | ...
答案 0 :(得分:1)
这应该可以解决问题
select ad_id, main, concat(t_0, ', ', t_1, ', ', t_8) as links
from images
where main = 0
group by ad_id having ad_id not in (select ad_id from images where main = 1)
union all
select ad_id, main, concat(t_0, ', ', t_1, ', ', t_8) as links from images where main = 1
答案 1 :(得分:0)
我认为这应该有效:
SELECT a.id,i.* FROM ads a
INNER JOIN images i
ON i.ad_id=a.id
WHERE i.main=1
GROUP BY a.id
LIMIT 10
编辑:我认为您也可以删除GROUP BY子句,因为A和I之间会有1对1的映射
答案 2 :(得分:0)
你根本不需要一个小组:
SELECT ads.id,images.*
FROM ads
INNER JOIN images ON(Images.ad_id=ads.id)
WHERE Images.Flag=x
ORDER BY ads.id
LIMIT 10
如果您想在没有标记时包含没有标记的图像,或者每个广告仅返回1个图像,即使多个图像具有该标记,则查询将更加困难。你必须澄清以获得更有针对性的答案。
编辑:这样的事可能有用
SELECT mainImages.Ad_ID2,
IFNULL(mainImages.T_0,images.T_0) as T0,
IFNULL(mainImages.T_1,images.T_1) as T1
FROM images
inner join
(SELECT ads.id as Ad_ID2,images.*
FROM ads
LEFT OUTER JOIN images ON(Images.ad_id=ads.id)
WHERE Images.Main=1) as mainImages
on images.Ad_ID=mainImages.Ad_ID2
ORDER BY mainImages.Ad_ID2
LIMIT 10
它使用子查询连接来创建带有图像数据的ID列表(仅在设置主标志的位置)然后再次重新连接图像表并填写新连接中的空图像数据(如果不是已经存在于子查询中。正如我所说,我不能在这里测试,但我认为一般概念是合理的。
编辑:修复查询以使用相关的更新表。
编辑:根据评论更改列名