0

假设我有一个一对多的关系,比如一个歌手表,每个人都唱过几首歌:DROP TABLE 歌手;CREATE TABLE 歌手(id bigint not null auto_increment,name varchar(255) not 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 子句集成到视图构造/连接逻辑中——但我不知道如何。这可能吗?

4

2 回答 2

3
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

于 2012-05-25T21:48:27.787 回答
1

我宁愿将 GROUP BY 用于此类事情,所以这是我的解决方案:

(我提出意见是为了方便,但你不必)

CREATE VIEW lastsongs AS
选择singers.id、singers.name、MAX(songs.id) AS lastsong
来自歌手
在歌曲中加入歌曲singer.singer_id =singers.id
GROUP BYsingers.id,singers.name;

创建视图 lastsongnames AS
选择 lastsongs.name,songs.name 作为歌曲名
来自最后的歌曲
加入歌曲songs.id = lastsongs.lastsong;

从 lastsongnames 中选择名称、歌曲名;
于 2012-05-25T22:13:01.770 回答