我正在研究一個程序,該程序允許用戶創建事件,並讓其他用戶回覆這些事件。提取這些事件時,我希望能夠在參與者進行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的一個限制,還是我仍然可以實現這個目標?
爲什麼你在同一個''server_id'引用user_event'既'events'(有題相結合)和用戶(與用戶名組合在一起)?看起來你最終會在單個用戶或單個事件的'users'和/或'events'中出現多條記錄,只是爲了將它們與'user_event'記錄進行交叉匹配。我知道這不能解決你的問題,但你的表格結構似乎非常令人懷疑。 – AgapwIesu
您是否想要在分組列中訂購,還是想要通過user_event.last_updated列來排序整個結果? –