2017-08-07 3 views
2

Ich arbeite an einem Programm, mit dem ein Benutzer Ereignisse erstellen kann und andere Benutzer RSVP für diese Ereignisse haben. Beim Abrufen dieser Ereignisse möchte ich die Teilnehmer nach der Anmeldung (Teilnehmer, die akzeptiert haben und Teilnehmer, die abgelehnt haben) sortieren können. Ich speichere die Zeit, die ein Benutzer RSVP in der Datenbank eingegeben hat. Dies sind die relevanten Tabellen:Wie bestelle ich eine Unterabfrage in 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 
); 

Zurück zu wollen, nach dem sortiert werden, wenn ein Benutzer hat abgesagt, ich wurde mit dieser Abfrage und es funktioniert großartig.

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; 

jedoch das Hinzufügen einer ORDER BY last updated Klausel zu den beiden verschachtelten SELECT-Anweisungen scheint keine Wirkung zu haben. Ist dies eine Einschränkung von MySQL, oder gibt es noch einen Weg, dies zu erreichen?

+0

Warum haben Sie die gleiche '' server_id' in user_event' Referenzierung beide 'events' (mit Titel kombiniert) und Anwender (in Verbindung mit Benutzername)? Scheint so, als würdest du mehrere Datensätze in "Benutzern" und/oder "Ereignissen" für einen einzelnen Benutzer oder ein einzelnes Ereignis erhalten, nur um sie mit ihren 'user_event'-Datensätzen zu vergleichen. Ich weiß, dass dies Ihre Frage nicht behandelt, aber Ihre Tabellenstruktur scheint sehr verdächtig zu sein. – AgapwIesu

+0

Soll die Bestellung in der gruppierten Spalte erfolgen oder möchten Sie das gesamte Ergebnis in der Spalte user_event.last_updated bestellen? –

Antwort

0

Sie wollen wahrscheinlich ORDER BY innen GROUP_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

Du bist ein Heiliger! Vielen Dank :) –

+0

@JamesGayfer Sie könnten meine Antwort akzeptieren (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235), wenn Ihre Frage war gelöst :) – lad2025