sqlite 获取子项的子项

voase2hg  于 2022-11-14  发布在  SQLite
关注(0)|答案(2)|浏览(165)

我有三张table:

CREATE TABLE Playlist
    (`id` int, `name` varchar(90))
;
    
INSERT INTO Playlist
    (`id`, `name`)
VALUES
    (1, 'Playlist_1'),
    (100, 'EmptyPlaylist'),
    (111, 'Playlist_222'),
    (1001, 'Playlist_4')
;

CREATE TABLE PlaylistItem
    (`id` int, `trackID` int, `playlistID` int)
;
    
INSERT INTO PlaylistItem
    (`id`, `trackID`, `playlistID`)
VALUES
    (3, 2, 1),
    (32, 22, 1),
    (321, 222, 1),
    (333, 222, 3),
    (333, 2, 3),
    (303, 200, 1001)
;

CREATE TABLE Track
    (`id` int, `title` varchar(300))
;
    
INSERT INTO Track
    (`id`, `title`)
VALUES
    (2, 'Foo'),
    (22, 'Bar'),
    (200, 'Only_In_Playlist_4_Which_Is_Not_Included_In_the_Query'),
    (222, 'Byy'),
    (21, 'NotInAnyPlaylist'),
    (20000, 'NotInAnyPlaylist_2')
;

小提琴
每个Playlist包含多个PlaylistItem,其中包含一个Track。我的目标是提供一个Playlist IDs数组,并将所有Tracks放入这些播放列表中(不仅仅是它们的ID)。
但是,我不知道如何从查询访问子项。我使用了连接,但它们合并了关键点,我只想从其他表中获得没有关键点的轨迹。我可以使用联接从Track中只选择键,但我的Track表有100多个键,它们可能会更改。
预期结果:
Id|标题

2|foo
22|Bar
222|BYY
我现在可以通过以下方式获得跟踪ID:

SELECT 
  trackID
FROM
  PlaylistItem
WHERE
  playlistID in ('1', '4') -- Here comes the array of IDs, for the example I want '1' and '4'
cbjzeqam

cbjzeqam1#

假设现在您的描述是正确的,并且您没有遗漏任何重要的信息,那么您只需要JOIN您的表并选择那些应该显示的列。
此查询将生成您所描述的结果:

SELECT p.id, t.title
FROM playlist p
JOIN PlaylistItem tp
ON p.id = tp.playlistID
JOIN track t 
ON t.id = tp.trackID;

您可以在以下位置进行验证:DB<>小提琴
如果需要显示播放列表的条件,可以添加WHERE子句或将条件添加到第一个JOIN。在WHERE子句中这样做可读性更好,在JOIN子句中这样做可以减少查询的执行时间。
例如,如果您只想显示播放列表1和4:

SELECT p.id, t.title
FROM playlist p
JOIN PlaylistItem tp
ON p.id = tp.playlistID
JOIN track t 
ON t.id = tp.trackID
WHERE p.id IN (1,4);

或:

SELECT p.id, t.title
FROM playlist p
JOIN PlaylistItem tp
ON p.id = tp.playlistID AND p.id IN (1,4)
JOIN track t 
ON t.id = tp.trackID;

如果不仅应该显示曲目的id,还应该显示该表中的其他列,请将这些列添加到所选内容中:

SELECT p.id, t.title, t.column2, t.column3,...
FROM playlist p
JOIN PlaylistItem tp
ON p.id = tp.playlistID
JOIN track t 
ON t.id = tp.trackID
WHERE p.id IN (1,4);

您也可以只写...,t.,但使用not recommended
最后一点:就像Forpas显示的那样,在您的特定情况下,您甚至可以只使用一个JOIN。我的回答假设这是因为您只显示了真实数据的一小部分,并且在真实场景中需要所有的表。但您当然应该检查这一点,如果确实不需要,请删除第二个JOIN

n3ipq98p

n3ipq98p2#

您只需要1个Join:

SELECT p.id, t.*
FROM track t INNER JOIN PlaylistItem p
ON p.trackID = t.id
WHERE p.playlistID IN (1, 4);

相关问题