2016-10-03 3 views
0

ich eine Auswahlabfrage erstellt haben, die mir die richtigen Linien zeigt, die ich aktualisieren müssen:MySQL UPDATE Abfrage mit SubQuery

SELECT `subject`,`ticket_messages`.`ticket_ID` as t, 
(SELECT `date` from `ticket_messages` where `ticket_ID`=t ORDER BY `date` DESC LIMIT 1) as d 
from `ticket_messages` 
LEFT JOIN `tickets` on `ticket_messages`.`ticket_ID`=`tickets`.`ticket_ID` 
GROUP BY t 
HAVING d<date_sub(curdate(), interval 5 day) 
ORDER BY t 

Ich werde PHP verwenden, aber die Abfrage zuerst in phpMyAdmin Rechts die oben Ausarbeiten Abfrage funktioniert und gibt mir die richtigen Zeilen. Im Grunde ist es alles über 5 Tage alt aufgelistet. Mach dir keine Sorgen, dass ich Thema und Datum auswähle, das war nur so, dass ich wusste, dass ich die richtigen Zeilen bekam.

Die Frage ist, wie mache ich das in eine Update-Abfrage? Es hat ein paar Stunden gedauert, bis das funktionierte.

Was werde ich Aktualisierung sein, ist dies:

UPDATE `tickets` SET `status`=? 

Grundsätzlich wird es in dem ticket_messages und die Suche nach der letzten Meldung suchen werden. Was ist meine ausgewählte Abfrage, und dann wird es in meiner Tabelle "Tickets" den Status aktualisieren, wenn das letzte Datum älter als 5 Tage ist. Die Tabellen sind referenziell verknüpft.

Also brauche ich ein Update mit einer Unterabfrage, und ich habe keine Idee, darüber zu gehen.

Ok, ein bisschen mehr hinzuzufügen. Ich probierte dies

UPDATE `tickets` SET `status`=8 
WHERE 
(
SELECT `subject`,`ticket_messages`.`ticket_ID` as t, 
(SELECT `date` from `ticket_messages` where `ticket_ID`=t ORDER BY `date` DESC LIMIT 1) as d 
from `ticket_messages` 
LEFT JOIN `tickets` on `ticket_messages`.`ticket_ID`=`tickets`.`ticket_ID` 
GROUP BY t 
HAVING d<date_sub(curdate(), interval 5 day) 
ORDER BY t)!=null 

Ich dachte, die Where-Klausel würde funktionieren, wenn es nicht gleich null war.

+0

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for- was-scheint-mir-eine-sehr-einfach-sql-abfrage – Strawberry

+0

Ich habe auf diese Seite geschaut und weiß nicht einmal worüber es spricht. Nicht einmal sicher, was ein MCVE überhaupt machen darf. –

+0

Das Aussehen ist nicht das Gleiche wie das Lesen. Versuche es zu lesen. – Strawberry

Antwort

1

Ihre erste Abfrage, ich mag es nicht, weil ich wirklich nicht sehe, warum Sie eine subSelect verwenden, warum Sie eine Gruppe verwenden. Was willst du für das Date?

Anyways Sie sagten, Sie nur die Tickets wollen älter als 5 Tage,

SELECT tm.ticket_ID, MAX(`date`) as d 
FROM `ticket_messages` as tm 
GROUP BY tm.ticket_ID 
HAVING d < date_sub(curdate(), interval 5 day) 

Und das ist alles für Sie erste Abfrage. Sag mir, wenn du die gleiche ID bekommst.

Jetzt für das Update, man muss nur JOIN:

UPDATE `tickets` 
INNER JOIN 
(SELECT tm.ticket_ID, MAX(`date`) as d 
    FROM `ticket_messages` as tm 
    GROUP BY tm.ticket_ID 
    HAVING d < date_sub(curdate(), interval 5 day)) AS T 
ON T.ticket_ID = `tickets`.ticket_ID 
SET`status`=? 
+0

Ich werde erklären. Die Notwendigkeit für die Ticket-Unterabfrage ist dies. In 'ticket_messages' gibt es mehrere IDs, da Sie mehrere Tickets pro ID haben können. Die Unterabfrage gibt mir das letzte Ticketdatum für eine ID. Also ist die Unterabfrage wichtig. Ich kann nicht einfach "Datum" verwenden, da ich das letzte Datum benötige. Die Gruppe nach ist wichtig, da ich ansonsten mehrere Zeilen des Tickets hätte. Ich möchte nur die letzte Zeile jedes Tickets. –

+0

ok du brauchst deine unterabfrage nicht. Ich werde meine Antwort bearbeiten –

+0

Pls meine Abfrage testen und mir sagen, ob es funktioniert. –