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?
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
Soll die Bestellung in der gruppierten Spalte erfolgen oder möchten Sie das gesamte Ergebnis in der Spalte user_event.last_updated bestellen? –