2017-08-07 18 views
2

私は、ユーザーがイベントを作成し、他のユーザーにこれらのイベントへの通知を許可するプログラムを開発中です。これらのイベントをフェッチするときには、出席者を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の制限ですか、それとも私はこれを達成する方法がまだありますか?

+0

あなたは(タイトルと組み合わせて) 'events'とユーザー(ユーザー名と組み合わせて)の両方を参照するuser_event'' 'で同じserver_id'を持っていないのはなぜ?あなたの 'user_event'レコードとクロス・マッチさせるために、単一のユーザーまたは単一イベントの' users'や 'events'に複数のレコードがあるように思えます。私はこれがあなたの質問に対処していないことを知っていますが、あなたのテーブル構造は非常に疑わしいようです。 – AgapwIesu

+0

グループ化された列で注文するか、user_event.last_updated列で全体の結果を注文しますか? –

答えて

0

おそらく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; 
+1

あなたは聖人です!ありがとうございました:) –

+0

@JamesGayferあなたの質問がされている場合、私の答え(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)を受け入れることができます解決済み:) – lad2025