0
SELECT a.id,i.* FROM ads a
    INNER JOIN images i ON i.ad_id=a.id
        GROUP BY a.id
            LIMIT 10

无法弄清楚,如何在图像表中选择带有“主”标志的图像。

对于一个 a.id,images 表中最多可以有 3 张照片,其中 3 张照片中的一张可以有一个字段 main=1。我需要优先选择标志 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 只有 1 行

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  

需要输出:

编号 | 主要 | 链接
217 | 1 | ...
225 | 0 | ...
226 | 0 | ...
228 | 0 | ...
4

3 回答 3

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
于 2010-08-18T17:09:59.400 回答
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 映射

于 2010-08-18T14:45:54.093 回答
0

您在这里根本不需要 group by:

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

如果你想在没有标志的情况下包含没有标志的图像,或者即使多个图像有标志,每个广告也只返回一张图像,那么查询将更加困难。您必须澄清以获得更有针对性的答案。

编辑:这样的事情可能会奏效

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 列表(仅在设置了主标志的位置),然后再次重新连接图像表并填充来自新连接的空图像数据(如果它不存在)子查询。正如我所说,我无法在这里进行测试,但我认为总体概念是合理的。

编辑:修复查询以使用有问题的更新表。

编辑:根据评论更改列名

于 2010-08-18T14:51:32.230 回答