mysql - 如何在 MySQL 中排序子查询?

标签 mysql sql database

我正在开发一个允许用户创建事件并让其他用户回复这些事件的程序。在获取这些事件时,我希望能够根据参与者收到 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
);

在想要按用户回复的时间进行排序之前,我一直在使用这个查询,而且效果很好。

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;

但是,在两个嵌套的 SELECT 语句中添加一个 ORDER BY last updated 子句似乎没有任何效果。这是 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;

关于mysql - 如何在 MySQL 中排序子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45553395/

相关文章:

php - 如何使用codeigniter以动态形式实现插入查询

java - 数据库连接池的用途?

asp.net-mvc - ASP.NET中MVC应用程序的结构应该是什么?

sql - 在teradata中将数十亿条记录从一张表移动到另一张表

c# - Sql Server和.Net是如何处理一个存储过程的

php - 如何在 mysql 中获取最近的行?

mysql - 使用 SELECT 插入 .... 如果 SELECT 返回 0 行怎么办

mysql - LINUX 使用基于 sed 的文件从文件中删除文本部分

mysql - NOT NULL 单元格的 SQL 语法

sql - 这段sql是什么意思