繁体   English   中英

Mysql:创建一个仅显示一对多关系子集的视图

[英]Mysql: Create a view showing only a subset of a one-to-many relationship

假设我有一对多的关系,例如歌手桌,每个歌手都有演唱的歌曲数:DROP TABLE歌手; 创建表歌手(id bigint不为null的auto_increment,name varchar(255)不为null,PRIMARY KEY(id));

INSERT INTO singers (name) VALUES ('Joe'), ('Bob');

DROP TABLE songs;
CREATE TABLE songs (
    id bigint not null auto_increment,
    singer_id bigint not null,
    name varchar(255) not null,
    PRIMARY KEY (id)
);

INSERT INTO songs (singer_id, name) VALUES (1, "foo"), (2, "bar"), (1, "baz"), (2, "quux");

假设按时间顺序正确写出了歌曲行,例如,我可以找到Joe在查询中演唱的最新歌曲

SELECT * FROM songs WHERE singer_id = 1 ORDER BY id DESC LIMIT 1;

现在,假设我想创建一个MySQL视图,其中包含每位歌手的一行以及该歌手演唱的最新歌曲。 换句话说,看起来像这样的表:

singer_id   singer_name    song_id   song_name
   1          Joe             3         baz
   2          Bob             4         quux

似乎这需要以某种方式将上面的ORDER BY / LIMIT子句集成到视图构造/连接逻辑中-但我不知道如何实现。 这可能吗?

select si.id, si.name, so.name, so.id 
from singers si
inner join songs so on so.singer_id = si.id
where so.id = (select max(songs.id) from songs where songs.singer_id=si.id)

http://sqlfiddle.com/#!2/d52c4/21

我宁愿使用GROUP BY进行此类操作,因此这是我的解决方案:

(为了方便起见,我提出了意见,但您不必这样做)

CREATE VIEW lastsongs AS 
SELECT singers.id, singers.name, MAX(songs.id) AS lastsong
FROM singers
JOIN songs ON songs.singer_id = singers.id
GROUP BY singers.id, singers.name;

CREATE VIEW lastsongnames AS
SELECT lastsongs.name, songs.name AS songname
FROM lastsongs
JOIN songs ON songs.id = lastsongs.lastsong;

SELECT name, songname FROM lastsongnames;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM