Sql 在常规订购之前定制订购?

Sql 在常规订购之前定制订购?,sql,postgresql,Sql,Postgresql,我有三张桌子: CREATE TABLE items ( id integer PRIMARY KEY, title varchar (256) NOT NULL ); INSERT INTO items (id, title) VALUES (1, 'qux'); INSERT INTO items (id, title) VALUES (2, 'quux'); INSERT INTO items (id, title) VALUES (3, 'quuz'); INSERT

我有三张桌子:

CREATE TABLE items (
    id integer PRIMARY KEY,
    title varchar (256) NOT NULL
);

INSERT INTO items (id, title) VALUES (1, 'qux');
INSERT INTO items (id, title) VALUES (2, 'quux');
INSERT INTO items (id, title) VALUES (3, 'quuz');
INSERT INTO items (id, title) VALUES (4, 'corge');
INSERT INTO items (id, title) VALUES (5, 'grault');

CREATE TABLE last_used (
    item_id integer NOT NULL REFERENCES items (id),
    date integer NOT NULL
);

INSERT INTO last_used (item_id, date) VALUES (2, 1000);
INSERT INTO last_used (item_id, date) VALUES (3, 2000);
INSERT INTO last_used (item_id, date) VALUES (2, 3000);

CREATE TABLE rating (
    item_id integer NOT NULL REFERENCES items (id),
    rating integer NOT NULL
);

INSERT INTO rating (item_id, rating) VALUES (1, 400);
INSERT INTO rating (item_id, rating) VALUES (2, 100);
INSERT INTO rating (item_id, rating) VALUES (3, 200);
INSERT INTO rating (item_id, rating) VALUES (4, 300);
INSERT INTO rating (item_id, rating) VALUES (5, 500);
我想按以下顺序选择行:

  • 与搜索字符串匹配的上次使用的项目
  • 与搜索字符串匹配的大多数评分项目
  • 与搜索字符串匹配的所有其他项目
  • 对于搜索
    i.title~*'(?=.*u)
    ,我得到:

       id   |   title   |   max(last_used.date)   |   rating.rating   
       3    |   quuz    |          2000           |        200
       2    |   quux    |          3000           |        100
       5    |   grault  |          null           |        500
       1    |   qux     |          null           |        400
    
    …使用以下代码:

    WITH used AS (
        SELECT lu.item_id
            FROM last_used lu
        JOIN (
            SELECT item_id, max(date) AS date
            FROM last_used
            GROUP BY 1
        ) sub USING (date)
     -- WHERE lu.user_id = 1
        ORDER BY lu.date DESC
    )
    SELECT i.id, i.title, r.rating
        FROM items i
        LEFT JOIN rating r
            ON r.item_id = i.id
        WHERE
            i.title ~* '(?=.*u)'
        ORDER BY
            i.id NOT IN (SELECT item_id FROM used),
            r.rating DESC NULLS LAST
        LIMIT 5 OFFSET 0
    
    是否可能获得以下结果(首先是最新使用的项目)


    您可以使用以下查询来获取所需的订单

    通过带有
    l.date DESC NULLS LAST,r.rating DESC NULLS LAST的
    ORDER BY
    子句:

    SELECT i.id, i.title, l.date, r.rating
        FROM items i
        LEFT JOIN rating r
            ON r.item_id = i.id
        LEFT JOIN ( SELECT item_id, max(date) AS date FROM last_used GROUP BY 1 ) l
            ON l.item_id = i.id        
        WHERE
            i.title ~* '(?=.*u)'
        ORDER BY l.date DESC NULLS LAST, r.rating DESC NULLS LAST
        LIMIT 5 OFFSET 0;
    

    您可以使用以下查询获得所需的订单

    通过带有
    l.date DESC NULLS LAST,r.rating DESC NULLS LAST的
    ORDER BY
    子句:

    SELECT i.id, i.title, l.date, r.rating
        FROM items i
        LEFT JOIN rating r
            ON r.item_id = i.id
        LEFT JOIN ( SELECT item_id, max(date) AS date FROM last_used GROUP BY 1 ) l
            ON l.item_id = i.id        
        WHERE
            i.title ~* '(?=.*u)'
        ORDER BY l.date DESC NULLS LAST, r.rating DESC NULLS LAST
        LIMIT 5 OFFSET 0;