Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql:创建一个视图,仅显示一对多关系的子集_Mysql_Sql_Views_One To Many - Fatal编程技术网

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

Mysql:创建一个视图,仅显示一对多关系的子集,mysql,sql,views,one-to-many,Mysql,Sql,Views,One To Many,假设我有一对多的关系,比如一桌歌手,每个人都唱了很多歌: 跳台歌手; 创造桌上歌手 id bigint非空自动增量, 名称varchar255不为空, 主键id ; 假设歌曲行是按时间顺序正确写出的,因此,例如,我可以找到Joe在查询中唱的最新歌曲 SELECT * FROM songs WHERE singer_id = 1 ORDER BY id DESC LIMIT 1; 现在,假设我想创建一个MySQL视图,其中包含每个歌手的一行以及该歌手最近演唱的歌曲。换句话说,一个如下所示的表:

假设我有一对多的关系,比如一桌歌手,每个人都唱了很多歌: 跳台歌手; 创造桌上歌手 id bigint非空自动增量, 名称varchar255不为空, 主键id ;

假设歌曲行是按时间顺序正确写出的,因此,例如,我可以找到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
这似乎需要以某种方式将上面的orderby/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)

对于这类事情,我更愿意使用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;
对于这类事情,我更愿意使用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;
sou.song_name不应该是aggregate的参数还是groupby子句的成员吗?也许MySQL能够处理这个问题,但这似乎不是有效的ANSI SQL。干得好,这至少对MySQL有效。这个变体将where子句中的子查询向上移动到from子句中,以避免mysql在冗余执行子查询时出现的问题,它似乎也可以工作:选择si.id、si.name、so.name、,so.id from singers si internal join select*from select*from songs order by id desc as s1 group by singer\u id as so.singer\u id=si.id;sou.song_name不应该是aggregate的参数还是groupby子句的成员吗?也许MySQL能够处理这个问题,但这似乎不是有效的ANSI SQL。干得好,这至少对MySQL有效。这个变体将where子句中的子查询向上移动到from子句中,以避免mysql在冗余执行子查询时出现的问题,它似乎也可以工作:选择si.id、si.name、so.name、,so.id from singers si internal join select*from select*from songs order by id desc as s1 group by singer\u id as so.singer\u id=si.id;