MySQL语句的问题

MySQL语句的问题,mysql,flags,Mysql,Flags,不知道如何在images表中选择带有标记“main”的图像 对于图像表中的一个a.id最多可以有3张照片,这3张照片中的一张可以有main=1的字段。我需要按优先顺序选择照片,其中flag main设置为1 SELECT a.id,i.* FROM ads a INNER JOIN images i ON i.ad_id=a.id GROUP BY a.id LIMIT 10 类似的东西,但每个广告id只有一行 CREATE DATABASE I

不知道如何在images表中选择带有标记“main”的图像

对于图像表中的一个a.id最多可以有3张照片,这3张照片中的一张可以有main=1的字段。我需要按优先顺序选择照片,其中flag main设置为1

SELECT a.id,i.* FROM ads a
    INNER JOIN images i ON i.ad_id=a.id
        GROUP BY a.id
            LIMIT 10
类似的东西,但每个广告id只有一行

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');
所需输出:

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 |主|链接 217 | 1 | ... 225 | 0 | ... 226 | 0 | ... 228 | 0 | ...
我认为这应该奏效:

id | main | links 217 | 1 | ... 225 | 0 | ... 226 | 0 | ... 228 | 0 | ...
编辑:我认为您也可以删除GROUP BY子句,因为a和I之间将有一个1:1的映射,您根本不需要GROUP BY:

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
如果您希望在没有标志的情况下包含没有标志的图像,或者即使多个图像具有标志,每个广告也只返回1个图像,那么查询将更加困难。你必须澄清才能得到更有针对性的答案

编辑:像这样的东西可能有用

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
它使用子查询联接创建一个包含图像数据的ID列表(仅在设置了主标志的位置),然后再次重新联接图像表,如果新联接在子查询中不存在,则填充新联接中的空图像数据。正如我所说,我不能在这里测试它,但我认为总体概念是合理的

编辑:修复了使用相关更新表的查询


编辑:根据注释更改列名这应该可以做到

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

您是否需要每个
a.id
只返回一个邮件图像,还是先返回主图像的所有三个图像?仅返回一个图像,最好将主标志设置为1仅返回一行,main=1如果显示示例输入和输出,可能会有所帮助。(例如,Ads具有这些字段和行,图像具有这些字段和行,我希望从两个表的联接返回此输出。)查询应选择图像,即使它们的主标志未设置为1。该标志仅用于一个目的,指向主照片,应显示在主页上。顺便说一句,如果我不按ad id分组,那么一个ad id将返回多行。您必须使用子查询,因为您要比较表中的行值。我会试一试,但我没有一个MySql实例在工作中对其进行测试…@Beck“查询应该选择图像,即使它们没有将主标志设置为1”,但您刚才说:“只有一个图像,最好将主标志设置为1”,每个广告id只有一个图像。如果3个图像中有一个主标志,则应该选择带有标志的图像,如果图像没有主标志,则选择“随机”或“第一”。呃,不,我错了。返回具有相同ad_id的3行。顺便说一句,有一个错误表示存在重复的列ad_id,我已重命名为MainImages的ad_id2。为所有图像使用主标志标记一个图像,而不是每个图像。例如,如果有更多带有标志main的图像,这将只选择一个
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