2017-03-20 1 views
0

Ich habe eine Tabelle mit dem Namen Archiv:Vergleichen Sie zwei MySQL-Tabellen und die Anzeige ändert

| staff_id | longname | username | projectNo | title | process | creation_time | 
| 01 | John Doe | John | 1701 | project1 | ANM(ld) | 2017-01-16 | 
| 02 | Aaron Jones | Aaron | 1701 | project1 | ANM(ch) | 2017-01-16 | 
| 01 | John Doe | John | 1702 | project2 | CGI(ld) | 2017-01-16 | 
| 01 | John Doe | John | 1701 | project1 | ANM(ld) | 2017-03-16 | 
| 02 | Aaron Jones | Aaron | 1701 | project1 | BGD(ch) | 2017-03-16 | 
| 01 | John Doe | John | 1702 | project2 | CGI(ld) | 2017-03-16 | 
| 03 | James Bond | James | 1702 | project2 | BGD(ld) | 2017-03-16 | 
| 03 | Peter Parker| Peter | 1702 | project2 | BAD(ld) | 2017-03-16 | 

Ich mag Zeilen mit min Datum von Tisch nehmen:

SELECT staff_id, longname, username, title, process, creation_time FROM archived 
WHERE creation_time IN (SELECT min(creation_time) FROM archived) 

und Zeilen mit spätestes Datum:

SELECT staff_id, longname, username, title, process, creation_time FROM archived 
WHERE creation_time IN (SELECT max(creation_time) FROM archived) 

Dann möchte ich empfangene Tabellen vergleichen und nur die Zeilen anzeigen, die geändert und erschienen. Also aus der aktuellen Tabelle möchte ich nur bekommen:

| staff_id | longname | username | projectNo | title | process | creation_time | 
| 02 | Aaron Jones | Aaron | 1701 | project1 | BGD(ch) | 2017-03-16 | 
| 03 | James Bond | James | 1702 | project2 | BGD(ld) | 2017-03-16 | 
| 03 | Peter Parker| Peter | 1702 | project2 | BAD(ld) | 2017-03-16 | 

gibt es eine Möglichkeit, es in einer einzigen Abfrage zu tun? wenn nicht, wie kann es in PHP getan werden?

Antwort

1

Wenn ich richtig verstehe, benötigen Sie ein right join

SELECT t2.* 
FROM (
      SELECT staff_id, longname, username, title, process, creation_time 
      FROM archived 
      WHERE creation_time IN (SELECT min(creation_time) FROM archived) 
     ) t1 
RIGHT JOIN (
      SELECT staff_id, longname, username, title, process, creation_time 
      FROM archived 
      WHERE creation_time IN (SELECT max(creation_time) FROM 
     ) t2 
ON  t1.staff_id = t2.staff_id AND 
     t1.projectNo = t2.projectNo AND 
     t1.process = t2.process 
WHERE t1.staff_id is null 

Das Recht zu tun beitreten werden erhalten alle Ergebnisse aus der zweiten Tabelle (die mit dem Maximum) und geben Sie null s in den Spalten der ersten Tabelle, wenn sie nicht übereinstimmen. Auf diese Weise können Sie filtern, ob eine der ersten Tabellenspalten null ist, um nur die Zeilen zu erhalten, die nicht übereinstimmen.

0

Sie links benutzen können Verbindung zwischen der max Ergebnistabelle und der min Ergebnistabelle

select t1.* from ( 
    SELECT staff_id, longname, username, title, process, creation_time FROM archived 
    WHERE creation_time IN (SELECT max(creation_time) FROM archived) 
) t1 
left join (
    SELECT staff_id, longname, username, title, process, creation_time FROM archived 
    WHERE creation_time IN (SELECT min(creation_time) FROM archived) 
) t2 on t1.staff_id = t2.staff_id and t1.creation_time = t2.creation_time 
where t2.creation_time is null