我有三张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'
2条答案
按热度按时间cbjzeqam1#
假设现在您的描述是正确的,并且您没有遗漏任何重要的信息,那么您只需要
JOIN
您的表并选择那些应该显示的列。此查询将生成您所描述的结果:
您可以在以下位置进行验证:DB<>小提琴
如果需要显示播放列表的条件,可以添加
WHERE
子句或将条件添加到第一个JOIN
。在WHERE
子句中这样做可读性更好,在JOIN
子句中这样做可以减少查询的执行时间。例如,如果您只想显示播放列表1和4:
或:
如果不仅应该显示曲目的id,还应该显示该表中的其他列,请将这些列添加到所选内容中:
您也可以只写...,t.,但使用是not recommended。
最后一点:就像Forpas显示的那样,在您的特定情况下,您甚至可以只使用一个
JOIN
。我的回答假设这是因为您只显示了真实数据的一小部分,并且在真实场景中需要所有的表。但您当然应该检查这一点,如果确实不需要,请删除第二个JOIN
。n3ipq98p2#
您只需要1个Join: