2017-08-07 130 views
2

我正在研究一個程序,該程序允許用戶創建事件,並讓其他用戶回覆這些事件。提取這些事件時,我希望能夠在參與者進行RSVP'd(既接受了接受者,也接受拒絕接受者)時對他們進行排序。我存儲用戶RSVP在數據庫中的時間。這些是相關的表格:如何在MySQL中訂購子查詢?

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'd,我使用這個查詢,它工作得很好。

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的一個限制,還是我仍然可以實現這個目標?

+0

爲什麼你在同一個''server_id'引用user_event'既'events'(有題相結合)和用戶(與用戶名組合在一起)?看起來你最終會在單個用戶或單個事件的'users'和/或'events'中出現多條記錄,只是爲了將它們與'user_event'記錄進行交叉匹配。我知道這不能解決你的問題,但你的表格結構似乎非常令人懷疑。 – AgapwIesu

+0

您是否想要在分組列中訂購,還是想要通過user_event.last_updated列來排序整個結果? –

回答

0

你可能想ORDER BYGROUP_CONCAT

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; 
+1

你是聖人!非常感謝你:) –

+0

@JamesGayfer如果你的問題一直存在,你可以接受我的回答(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)解決了 :) – lad2025