一件商品有一个像册,一个像册有N张图,只有一张图是封面

街头小贩 2018-08-13 08:51:20
商品表product,通过外键album引用album像册表的ID,
album无外键连接图片表(album_image),无外键连接商品表(product),
album_image.cover指示图片是否是像册的封面(1是封面,0不是),album_image表的外键album引用像册表的ID。

需求: 现在要求查出商品的同时select album_image.link(图片地址).有的像册是没有设置封面的,这时需要取(album_image.album=product.album记录的)最大ID相关的link作为封面

求需求的MySQL数据库可执行的SQL语句
...全文
386 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2018-08-14
  • 打赏
  • 举报
回复

select * 
from apo_product A
left join apo_album B on A.album=B.ID
left join apo_album_item C on B.ID=C.album
where cover=1
or (not exists (select 1 from apo_album_item where album=C.album and ifnull(COVER,0)=1) 
    and not exists (select 1 from apo_album_item where album=C.album and ID>C.ID))
zjcxc 元老 2018-08-14
  • 打赏
  • 举报
回复
ORDER BY LIMIT 1, 参考在 mysql 版的回复
二月十六 版主 2018-08-14
  • 打赏
  • 举报
回复
引用 10 楼 xiaofanku 的回复:
apo_album的id=1,17中的所有图片都被删除了

被删了那就读取不到了,这样的想怎么处理?
街头小贩 2018-08-13
  • 打赏
  • 举报
回复
apo_album的id=1,17中的所有图片都被删除了
街头小贩 2018-08-13
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
[quote=引用 6 楼 xiaofanku 的回复:]

select p.*, ai.link
from apo_product as p
join apo_album as a on p.album=a.id
left outer join apo_album_item as ai on ai.album=a.id
where
ai.cover=1
or (ai.cover=0 and ai.id = (
select max(_ai.id)
from apo_album_item as _ai
where _ai.album=ai.album))
group by p.id


这是我写的,但数对不起来,一直没找到少的原因,用“吉普赛的歌”的SQL找到原因了:商品表有像册,但图片表中无像册关联


album_image表的外键album引用像册表的ID

这个不是图片表关联的相册?[/quote]
因为apo_product只与apo_album连接,apo_album_item与apo_album连接,

二月十六 版主 2018-08-13
  • 打赏
  • 举报
回复
引用 6 楼 xiaofanku 的回复:

select p.*, ai.link
from apo_product as p
join apo_album as a on p.album=a.id
left outer join apo_album_item as ai on ai.album=a.id
where
ai.cover=1
or (ai.cover=0 and ai.id = (
select max(_ai.id)
from apo_album_item as _ai
where _ai.album=ai.album))
group by p.id


这是我写的,但数对不起来,一直没找到少的原因,用“吉普赛的歌”的SQL找到原因了:商品表有像册,但图片表中无像册关联


album_image表的外键album引用像册表的ID

这个不是图片表关联的相册?
街头小贩 2018-08-13
  • 打赏
  • 举报
回复
表schema

-- 商品
CREATE TABLE `apo_product` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`SERIALCODE` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`price` decimal(12,2) DEFAULT NULL,
`RANKING` int(11) DEFAULT NULL,
`SALE` tinyint(1) DEFAULT '0',
`STATUS` tinyint(1) DEFAULT '0',
`STORAGES` int(11) DEFAULT NULL,
`album` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `UNQ_apo_product_0` (`SERIALCODE`),
KEY `FK_apo_product_album` (`album`),
CONSTRAINT `FK_apo_product_album` FOREIGN KEY (`album`) REFERENCES `apo_album` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- 像册
CREATE TABLE `apo_album` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ENTRYDATE` datetime DEFAULT NULL,
`MODIFYDATE` datetime DEFAULT NULL,
`NAME` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`STATUS` tinyint(1) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- 像册图片
CREATE TABLE `apo_album_item` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`COVER` tinyint(1) DEFAULT '0',
`ENTRYDATE` datetime DEFAULT NULL,
`LINK` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`MODIFYDATE` datetime DEFAULT NULL,
`STATUS` tinyint(1) DEFAULT '0',
`TITLE` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`album` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `UNQ_apo_album_item_0` (`LINK`),
KEY `FK_apo_album_item_album` (`album`),
CONSTRAINT `FK_apo_album_item_album` FOREIGN KEY (`album`) REFERENCES `apo_album` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
街头小贩 2018-08-13
  • 打赏
  • 举报
回复

select p.*, ai.link
from apo_product as p
join apo_album as a on p.album=a.id
left outer join apo_album_item as ai on ai.album=a.id
where
ai.cover=1
or (ai.cover=0 and ai.id = (
select max(_ai.id)
from apo_album_item as _ai
where _ai.album=ai.album))
group by p.id


这是我写的,但数对不起来,一直没找到少的原因,用“吉普赛的歌”的SQL找到原因了:商品表有像册,但图片表中无像册关联
街头小贩 2018-08-13
  • 打赏
  • 举报
回复
引用
你的问题描述得不太清楚, 猜了一下, 看是不是上面这样?

如果不是, 把你的测试表的表结构, 测试数据 用详细的脚本贴出来, 结果也贴出来。
尽量不要让人家去猜。

你的理解对
二月十六 版主 2018-08-13
  • 打赏
  • 举报
回复
SELECT
t.*,
album_image.link
FROM
(
SELECT
product.id,
product.name,
MAX(album_image.id) AS imgid
FROM
product
JOIN
album_image
ON album_image.album = product.album
GROUP BY
product.id,
product.name
) t
JOIN
album_image
ON t.imgid = album_image.id;


引用 2 楼 xiaofanku 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
SELECT
t.*,
album_image.link
FROM
(
SELECT
product.id,
product.name,
MAX(album_image.id) AS imgid
FROM
product
JOIN
album_image
ON album_image.album = product.album
GROUP BY
product.id,
product.name
) t
JOIN
album_image
ON t.imgid = album_image.id;
有封面设置的在哪[/quote]
album_image.link这个是

引用 2 楼 xiaofanku 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
SELECT
t.*,
album_image.link
FROM
(
SELECT
product.id,
product.name,
MAX(album_image.id) AS imgid
FROM
product
JOIN
album_image
ON album_image.album = product.album
GROUP BY
product.id,
product.name
) t
JOIN
album_image
ON t.imgid = album_image.id;
有封面设置的在哪[/quote]
额,没注意cover那个,楼主给点测试数据吧,和对应的结果
吉普赛的歌 版主 2018-08-13
  • 打赏
  • 举报
回复
drop table if exists `product_test`;
drop table if exists `album_image_test`;
create table product_test(
pid int primary key,
pname nvarchar(20),
album int
);
create table album_image_test(
imageId int primary key,
album int,
link varchar(20),
cover bit
);
insert into album_image_test values(1, 1, '/image/1.jpg',0);
insert into album_image_test values(2, 1, '/image/2.jpg',0);
insert into album_image_test values(3, 2, '/image/3.jpg',1);

insert into product_test values(1,'饼干',1);
insert into product_test values(2,'月饼',2);

select p.pname
, max(i.cover) as cover
, case when max(i.cover)=1 then i.link
else (select ii.link from album_image_test as ii where ii.imageId=max(i.imageId) )
end as link
from product_test as p
left join album_image_test as i on p.album=i.album
group by p.pid,p.pname
;



你的问题描述得不太清楚, 猜了一下, 看是不是上面这样?

如果不是, 把你的测试表的表结构, 测试数据 用详细的脚本贴出来, 结果也贴出来。
尽量不要让人家去猜。
街头小贩 2018-08-13
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
SELECT
t.*,
album_image.link
FROM
(
SELECT
product.id,
product.name,
MAX(album_image.id) AS imgid
FROM
product
JOIN
album_image
ON album_image.album = product.album
GROUP BY
product.id,
product.name
) t
JOIN
album_image
ON t.imgid = album_image.id;
有封面设置的在哪
二月十六 版主 2018-08-13
  • 打赏
  • 举报
回复
SELECT
t.*,
album_image.link
FROM
(
SELECT
product.id,
product.name,
MAX(album_image.id) AS imgid
FROM
product
JOIN
album_image
ON album_image.album = product.album
GROUP BY
product.id,
product.name
) t
JOIN
album_image
ON t.imgid = album_image.id;

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧