sql >> データベース >  >> RDS >> Mysql

MySQLクエリ-グループごとの最近のエントリ

    私はそれを本当にシンプルに保ち、トリガーを使用してカテゴリテーブルにlast_post_idを維持し、投稿テーブルに簡単に参加できるようにします-次のようになります:

    単純なクエリ

    select
     pc.cat_id,
     pc.name,
     u.username,
     bp.*
    from
     post_category pc
    inner join blog_post bp on pc.last_post_id = bp.post_id
    inner join users u on bp.user_id = u.user_id
    order by
     pc.cat_id;
    
    +--------+------+----------+---------+---------+---------------------+
    | cat_id | name | username | post_id | user_id | post_date           |
    +--------+------+----------+---------+---------+---------------------+
    |      1 | cat1 | bar      |       3 |       2 | 2011-02-09 12:45:33 |
    |      2 | cat2 | BAR      |       5 |       3 | 2011-02-09 12:45:33 |
    |      3 | cat3 | f00      |       4 |       1 | 2011-02-09 12:45:33 |
    +--------+------+----------+---------+---------+---------------------+
    

    テーブル

    drop table if exists post_category;
    create table post_category
    (
    cat_id smallint unsigned not null auto_increment primary key,
    name varchar(255) unique not null,
    last_post_id int unsigned null,
    key (last_post_id)
    )
    engine=innodb;
    
    drop table if exists users;
    create table users
    (
    user_id int unsigned not null auto_increment primary key,
    username varbinary(32) unique not null
    )
    engine=innodb;
    
    drop table if exists blog_post;
    create table blog_post
    (
    post_id int unsigned not null auto_increment primary key,
    user_id int unsigned not null,
    post_date datetime not null,
    key (post_date, user_id)
    )
    engine=innodb;
    
    drop table if exists blog_post_category;
    create table blog_post_category
    (
    cat_id smallint unsigned not null,
    post_id int unsigned not null,
    primary key (cat_id, post_id)
    )
    engine=innodb;
    

    トリガー

    delimiter #
    
    create trigger blog_post_before_ins_trig before insert on blog_post
    for each row
    begin
      set new.post_date = now();
    end#
    
    create trigger blog_post_category_before_ins_trig before insert on blog_post_category
    for each row
    begin
      update post_category set last_post_id = new.post_id where cat_id = new.cat_id;
    end#
    
    delimiter ;
    

    テストデータ

    insert into post_category (name) values ('cat1'),('cat2'),('cat3'),('cat4');
    insert into users (username) values ('f00'),('bar'),('BAR'),('alpha'),('beta');
    
    insert into blog_post (user_id) values (1),(1),(2),(1),(3);
    insert into blog_post_category (cat_id, post_id) values
    (1,1),(1,3),
    (2,1),(2,5),
    (3,1),(3,3),(3,4);
    

    これがお役に立てば幸いです:)



    1. 接続が拒否されました(PGError)(postgresqlおよびrails)

    2. CASE ..OracleSQLのWHEN式

    3. PostgreSQLが存在しない場合はテーブルを作成します

    4. $filterがMySQLを使用するJPA/Olingo2.0.11で機能しない