0

それぞれが多数の曲を歌った歌手のテーブルなど、1 対多の関係があるとします。 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) を選択します
歌手から
JOIN 曲を on songs.singer_id = singers.id
GROUP BY singers.id、singers.name;

CREATE VIEW lastsongnames AS
SELECT lastsongs.name、songs.name AS songname
FROM ラストソングス
JOIN 曲を on songs.id = lastsongs.lastsong;

SELECT name, songname FROM lastsongnames;
于 2012-05-25T22:13:01.770 に答える