2012-04-08 6 views
4

Ich habe diese Abfrage versucht zu schreiben, aber kann nicht scheinen, richtig aus irgendeinem Grund oder einem anderen zu gelangen ..Benötigen Schreiben SQL-Abfrage in Postgresql Hilfe

Was ich tun müssen, ist:

Ändern Sie den Status einer Frage in "Geschlossen", wenn in den letzten 24 Stunden kein Update für diese Frage in die qUpdateTable eingefügt wurde.

Ich möchte nur, dass es geschlossen wird, wenn ein Mitarbeiter mindestens einmal darauf geantwortet hat.

Sie können feststellen, ob ein Mitarbeiter oder ein Benutzer auf die Frage geantwortet hat, indem Sie die qUpdateTable überprüfen und sehen, ob ein Feld StaffID leer ist oder einen Wert für diese bestimmten Tickets hat. Wenn eine Personal-ID vorhanden ist, wurde sie von einem Mitarbeiter aktualisiert. Ist dies jedoch nicht der Fall, wurde das Update von einem Benutzer durchgeführt.

Essentiell ist die Art, wie dies funktioniert, ist ein Benutzer eine Frage durch Einfügen in die Fragetabelle, und Antworten werden durch Einfügen in die Tabelle qUpdate gemacht und mit der ursprünglichen Frage mit dem Fremdschlüssel verknüpft - "QuestionID".

Die Tabellen:

CREATE TABLE Staff 
(
    ID  INTEGER NOT NULL PRIMARY KEY, 
    Name  VARCHAR(40) NOT NULL 
); 

CREATE TABLE Customer 
(
    ID  INTEGER NOT NULL PRIMARY KEY, 
    Name  VARCHAR(40) NOT NULL, 
    Email  VARCHAR(40) NOT NULL 
); 

CREATE TABLE Product 
(
    ID  INTEGER NOT NULL PRIMARY KEY, 
    Name TEXT NOT NULL 
); 

CREATE TABLE Question 
(
    ID  INTEGER NOT NULL PRIMARY KEY, 
    Problem VARCHAR(1000), 
    Status VARCHAR(20) NOT NULL DEFAULT 'open', 
    Priority INTEGER NOT NULL, 
    LoggedTime TIMESTAMP NOT NULL, 
    CustomerID INTEGER NOT NULL, 
    ProductID INTEGER NOT NULL, 
    FOREIGN KEY (ProductID) REFERENCES Product(ID), 
    FOREIGN KEY (CustomerID) REFERENCES Customer(ID), 
    CHECK (Status IN ('open','closed') AND Priority IN (1,2,3)) 

); 

CREATE TABLE qUpdate 
(
    ID  INTEGER NOT NULL PRIMARY KEY, 
    Message VARCHAR(1000) NOT NULL, 
    UpdateTime TIMESTAMP NOT NULL, 
    QuestionID INTEGER NOT NULL, 
    StaffID INTEGER, 
    FOREIGN KEY (StaffID) REFERENCES Staff(ID), 
    FOREIGN KEY (QuestionID) REFERENCES Question(ID) 
); 

Einige Beispieleinsätze:

INSERT INTO Customer (ID, Name, Email) VALUES (1, 'testname1', 'testemail1'); 

INSERT INTO Customer (ID, Name, Email) VALUES (2, 'testname2', 'testemail2'); 

INSERT INTO Staff (ID, Name) VALUES (1, 'Don Keigh'); 

INSERT INTO Product (ID, Name) VALUES (1, 'Xbox'); 

INSERT INTO Question (ID, Problem, Status, Priority, LoggedTime, CustomerID, ProductID) 
VALUES (1, 'testproblem1', 'open', 3, '2012-04-14 09:30', 2, 1); 

INSERT INTO Question (ID, Problem, Status, Priority, LoggedTime, CustomerID, ProductID) 
VALUES (2, 'testproblem2', 'open', 3, '2012-04-14 09:30', 2, 1); 

INSERT INTO qUpdate (ID, Message, UpdateTime, StaffID, QuestionID) VALUES (2, 'testmessage1','2012-07-12 14:27', 1, 1); 

INSERT INTO qUpdate (ID, Message, UpdateTime, QuestionID) VALUES (3, 'testmessage1','2012-06-18 19:42', 2); 

Was ich bisher gemacht (was natürlich nicht funktioniert)

UPDATE Question 
SET Status = 'closed' 
WHERE EXISTS 
(SELECT qUpdate.QuestionID 
MAX(qUpdate.UpdateTime - Now() = INTERVAL '1 day') FROM qUpdate 
LEFT JOIN Question ON qUpdate.QuestionID = Question.ID 
WHERE qUpdate.StaffID IS NOT NULL); 

I realisiere meine Erklärung kann ein wenig verwirrend sein, wenn Sie weitere Informationen benötigen, und Ich werde antworten so schnell wie möglich

+1

+1 für die Bereitstellung aller SQL für einen Testfall (obwohl Sie die create-Tabelle für 'Produkt' verpasst haben) –

+0

Jemand gab eine gute Antwort, aber seit es gelöscht .. Wenn jemand Licht auf was der tU Teil scheinen könnte von der Abfrage heißt dann würde es wirklich in Zukunft helfen. 'set Status = 'geschlossen' von ( wählen Frage, max (Update) Lastupdatetime von qUpdate Gruppe von QuestionID mit count (StaffID)> 0 ) tuen wo Question.ID = tU.TicketID und Question.LoggedTime Jimmy

Antwort

3
UPDATE Question 
SET Status = 'closed' 
where 
-- this clause asserts there's at least one staff answer 
exists (
    select null from qUpdate 
    where qUpdate.QuestionID = Question.ID 
    and StaffID is not null 
) 
-- this clause asserts there's been no update in the last 24 hours 
and not exists (
    select null from qUpdate 
    where qUpdate.QuestionID = Question.ID 
    and qUpdate.UpdateTime > (now() - interval '24 hours') 
) 
and Status = 'open'; 

Sie werden mit ziemlicher Sicherheit einen Index wollen auf qUpdate (QuestionID) oder möglicherweise qUpdate (QuestionID, Update) oder qUpdate (QuestionID, StaffID) eine gute Leistung auf den Subselects zu bekommen in die existiert() Tests.

+0

Vielen Dank für die schnelle Antwort! Obwohl ich es nur basierend auf ausgeführt und keine Felder aktualisiert wurden Wird auch das für die neueste UpdateTime überprüfen? Es kann mehr als ein qUpdate geben und daher muss das mit einer Frage verbundene qUpdate, das das späteste Datum hat, überprüft werden. – Jimmy

+0

Dies sind die Inserts, die ich gerade ausgeführt habe: 'INSERT INTO (ID, Name) VALUES (1, 'Don Keigh');' 'INSERT INTO Frage (ID, Problem, Status, Priorität, LoggedTime, CustomerID, ProductID) WERTE \t (1, 'testproblem1', 'offen', 3, '2012-08-14 09:30', 2, 1); ' ' INSERT INto qUpdate (ID, Nachricht, UpdateTime , StaffID, QuestionID) VALUES (2, 'testmessage1', '2012-06-10 09:30', 1, 1); ' – Jimmy

+0

@Jimmy, die UpdateTime-Daten in Ihrer Probe liegen in der Zukunft, also werden sie mehr sein neuer als jetzt() - 24hours. – dbenhur

Verwandte Themen