私は、ユーザーがイベントを作成し、他のユーザーにこれらのイベントへの通知を許可するプログラムを開発中です。これらのイベントをフェッチするときには、出席者をRSVPしたとき(受諾したものと辞退したものの両方)に並べ替えることができます。ユーザーにRSVPされた時間をデータベースに保存します。ユーザーは、私はこのクエリを使用していたし、それは素晴らしい仕事をしていた、RSVP'd時にソートしたい前へ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
);
:これらは、関連するテーブルです。
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;
ただし、ネストされた2つのSELECT文にORDER BY last updated
句を追加しても、効果があるとは思われません。これはMySQLの制限ですか、それとも私はこれを達成する方法がまだありますか?
あなたは(タイトルと組み合わせて) 'events'とユーザー(ユーザー名と組み合わせて)の両方を参照するuser_event'' 'で同じserver_id'を持っていないのはなぜ?あなたの 'user_event'レコードとクロス・マッチさせるために、単一のユーザーまたは単一イベントの' users'や 'events'に複数のレコードがあるように思えます。私はこれがあなたの質問に対処していないことを知っていますが、あなたのテーブル構造は非常に疑わしいようです。 – AgapwIesu
グループ化された列で注文するか、user_event.last_updated列で全体の結果を注文しますか? –