我有4张桌子,
ModTable file_id,mod_flag
TrackTable artist_id album_id FILE_ID 标题
AlbumTable album_id,专辑
ArtistTable artist_id,艺术家
我需要从这些表中获取artist_id,album_id,album,artist,fid,title以获取所有file_id,其中mod_flag = 1
到目前为止,我所做的是(伪代码)
1. SELECT file_id, artist_id, album_id, title FROM TrackTable WHERE file_id IN (SELECT file_id FROM ModTable WHERE mod_flag=1);
在极端情况下,这将返回大约30000个file_ids。所以对于所有这些file_ids,
2. for(int count=0; count < noOfRecords/*30000*/; count++)
SELECT artist FROM ArtistTable WHERE artist_id==%llu
SELECT album FROM AlbumTable WHERE album_id==%llu
以上查询对我有用,但我想知道这是否是实现此目的的优化方式。我应该避免循环内的查询吗?
答案 0 :(得分:1)
Normaly你会加入如下表格。这应该会带来更好的性能,因为连接可以通过查询引擎进行优化。
SELECT
t.file_id,
t.artist_id,
t.album_id,
t.title,
a.album,
ar.artist
FROM
TrackTable t
join AlbumTable a on t.album_id = a.album_id
join ArtistTable ar on t.artist_id = ar.artist_id
WHERE t.file_id IN (SELECT file_id FROM ModTable WHERE mod_flag=1);