2011-04-29 102 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

相关问题