繁体   English   中英

如何在MySQL中订购子查询?

[英]How to order a subquery in MySQL?

我正在开发一个程序,该程序允许用户创建事件,并让其他用户对这些事件进行回复。 在获取这些事件时,我希望能够按参与者接受RSVP的时间(已接受和已拒绝的参与者)进行排序。 我将用户RSVP的时间存储在数据库中。 这些是相关的表:

    CREATE TABLE users (
    username VARCHAR(50) NOT NULL,
    server_id VARCHAR(40) NOT NULL,
    role VARCHAR(10),
    PRIMARY KEY (username, server_id),
    FOREIGN KEY (server_id) REFERENCES servers(server_id)
      ON DELETE CASCADE
);

CREATE TABLE events (
    server_id VARCHAR(40) NOT NULL,
    start_time DATETIME NOT NULL,
    time_zone VARCHAR(5) NOT NULL,
    title VARCHAR(256) NOT NULL,
    description VARCHAR(1000),
    PRIMARY KEY (server_id, title),
    FOREIGN KEY (server_id) REFERENCES servers(server_id)
        ON DELETE CASCADE
);

CREATE TABLE user_event (
    username VARCHAR(50) NOT NULL,
    server_id VARCHAR(40) NOT NULL,
    title VARCHAR(256) NOT NULL,
    attending BOOLEAN NOT NULL,
    last_updated DATETIME NOT NULL,
    PRIMARY KEY (username, server_id, title),
    FOREIGN KEY (server_id, title) REFERENCES events(server_id, title)
        ON DELETE CASCADE,
    FOREIGN KEY (server_id, username) REFERENCES users(server_id, username)
      ON DELETE CASCADE
);

在想按用户RSVP的时间进行排序之前,我使用的是此查询,并且效果很好。

SELECT title, description, start_time, time_zone, (
            SELECT GROUP_CONCAT(DISTINCT username)
            FROM user_event
            WHERE user_event.server_id = %s
            AND user_event.title = %s
            AND user_event.attending = 1)
            AS accepted, (
            SELECT GROUP_CONCAT(DISTINCT username)
            FROM user_event
            WHERE user_event.server_id = %s
            AND user_event.title = %s
            AND user_event.attending = 0)
            AS declined
          FROM events
          WHERE server_id = %s
          AND title = %s;

但是,将ORDER BY last updated子句添加到两个嵌套的SELECT语句中似乎没有任何效果。 这是MySQL的局限性吗,还是还有一种方法可以做到这一点?

您可能希望在GROUP_CONCAT ORDER BY

SELECT title, description, start_time, time_zone, (
            SELECT GROUP_CONCAT(DISTINCT username ORDER BY last updated)
            FROM user_event
            WHERE user_event.server_id = %s
            AND user_event.title = %s
            AND user_event.attending = 1)
            AS accepted, (
            SELECT GROUP_CONCAT(DISTINCT username ORDER BY last updated)
            FROM user_event
            WHERE user_event.server_id = %s
            AND user_event.title = %s
            AND user_event.attending = 0)
            AS declined
          FROM events
          WHERE server_id = %s
          AND title = %s;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM