我有三張桌子:
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 | 富 |
| 22 | 酒吧 |
| 222 | 拜伊 |
我現在通過以下方式獲得軌道 ID:
SELECT
trackID
FROM
PlaylistItem
WHERE
playlistID in ('1', '4') -- Here comes the array of IDs, for the example I want '1' and '4'
uj5u.com熱心網友回復:
假設您的描述現在是正確的,并且您沒有錯過告訴我們任何重要的事情,您只需要在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<>fiddle
如果您需要顯示播放串列的條件,您可以添加一個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.*,但不建議使用 * 。
最后一點:就像 forpas 所示,在您的特定情況下,您甚至可以只使用一個JOIN. 我的回答假設這是因為您只顯示了一小部分真實資料,并且您需要真實場景中的所有表格。但是您當然應該檢查這一點,如果確實不需要,請洗掉第二個JOIN.
uj5u.com熱心網友回復:
您只需要 1 個加入:
SELECT p.id, t.*
FROM track t INNER JOIN PlaylistItem p
ON p.trackID = t.id
WHERE p.playlistID IN (1, 4);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/528244.html
標籤:sqlsqlite
上一篇:如何將CSV檔案匯入附加資料庫?
