2011-04-29 80 views
0

我模仿一個小型的數據庫更容易解釋最後插入的項目:選擇不僅關係到另一個註冊表

CREATE TABLE bands (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(120) NULL, 
    PRIMARY KEY(id) 
) 
TYPE=InnoDB; 

CREATE TABLE albums (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    band_id INTEGER UNSIGNED NOT NULL, 
    album_name VARCHAR(120) NULL, 
    rating INTEGER UNSIGNED NULL, 
    insertion_date TIMESTAMP NULL, 
    PRIMARY KEY(id), 
    INDEX albums_FKIndex1(band_id), 
    FOREIGN KEY(band_id) 
    REFERENCES bands(id) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION 
) 
TYPE=InnoDB; 

現在,假裝我們已經有一些樂隊和他們各自的表中登記的多張唱片,我想僅選擇每個已註冊樂隊中最後插入的專輯。

PS:我必須使用「album.insertion_date」字段來確定哪個相冊是最後插入的。

+0

也許你可以粘貼到某處(https://gist.github.com/)插入的小轉儲?我需要執行查詢測試。 – Anatolij 2011-04-29 12:57:55

+0

您將問題標記爲Postgresql,但您的SQL清楚地顯示了MySQL。你在用什麼? – 2011-04-29 14:04:03

+0

我正在使用postgres。看起來我以錯誤的格式導出了SQL – marcio 2011-04-29 14:25:50

回答

1

嘗試通過insertion_date和帶連接兩個表和篩選:

SELECT al.* 
FROM albums al 
INNER JOIN bands b ON al.band_id=b.id 
WHERE al.insertion_date=(
    SELECT max(insertion_date) 
    FROM albums 
    WHERE band_id=b.id 
) 
+0

錯誤1054(42S22):'where子句'中的未知列'b.band_id' – Narf 2011-04-29 17:18:35

+0

@Narf true,我更正了錯誤,是b.id而不是b.band_id – Doliveras 2011-04-29 17:29:55

+0

Doliveras獲勝!恭喜,並且執行時間很好(即使數據庫填滿了18980個註冊表) – marcio 2011-04-29 18:02:44

1

試試這個:

select b.name, a.album_name, a.isertion_date 
    from bands b, albums a 
    where a.band_id = b.id 
    and a.insertion_date = (select max(a1.insertion_date) from albums a1 where a1.band_id = b.id) 
+0

這會帶來來自特定樂隊的最後一張專輯,我想從一個SQL中的每個樂隊獲取最後一張專輯。我認爲問了錯誤的問題大聲笑 – marcio 2011-04-29 13:23:20

0

考慮到你的相冊IDS是AUTO_INCREMENT和可能性爲insertion_dateNULL(因爲它是默認值),使用insertion_date判定結果不這樣做,但最聰明的事...你去:

SELECT DISTINCT band, last_album, insertion_date 
FROM (
     SELECT bands.name AS band, albums.album_name AS last_album, albums.insertion_date 
     FROM bands 
     JOIN albums ON bands.id=albums.band_id 
     ORDER BY albums.insertion_date DESC 
    ) t1 
GROUP BY band; 
+0

album_name不在group by子句中,所以mysql可以自由地返回同一樂隊中的任何album_name,它可能不是最大的那個插入日期 – piotrm 2011-04-29 17:08:29

+0

使用'ORDER BY'時不是問題,但反正是不正確的...所以我只是編輯它。 – Narf 2011-04-29 17:11:22

+0

關於使用插入日期選擇最後一個註冊表:不幸的是,我不是數據庫遷移的負責人。新數據庫的註冊表沒有按照與舊數據庫的註冊表相同的順序插入。這很糟糕,但必須完成。 – marcio 2011-05-01 23:53:30

相關問題