2016-03-19 6 views
0

Ich habe die Netzecke zu Ecke gesucht, aber habe keine Lösung für mein Problem gefunden. Ich habe eine Tabelle namens Master, die Aufzeichnungen von Ausrüstung mit Problemen enthält. Wenn die Ausrüstung zum ersten Mal in der Datenbank aufgezeichnet wird, ist der Status des Jobs cat_id = 11, wenn jemand sie repariert, geben sie die gleiche Information erneut ein und ändern den Status als cat_id = 1 oder 2 oder 3 usw. Wenn die cat_id (status) auf etwas anderes als cat_id = 11 geändert wird, möchte ich diesen Job mit dieser "mo_number" UND cat_id = etwas anderes, um nicht in der Select-Abfrage zu erscheinen.mysql 2 Zeilen Vergleich in der gleichen Tabelle Datensätze

Tabelle: Meister

id mo_number part_number cat_id  date_created user_id 
15 7200023   347893  11  01/03/2016  1 
33 7200023   347893  1  10/03/2016  5 
34 7200045   457890  11  11/03/2016  1 

expected : 
id mo_number part_number cat_id  date_created user_id 
34 7200045   457890  11  11/03/2016  1 

Hier ist meine komplette Auswahlabfrage:

SELECT m.comment_id, m.mo_number, m.part_number, m.serial_number, m.comment, 
     m.date_created, CONCAT(u.first_name, ' ', u.last_name) as name 
     FROM master AS m 
     INNER JOIN users as u ON u.user_id = m.user_id 
      INNER JOIN category as c ON m.cat_id = c.cat_id 
     WHERE u.user_id = '1' AND m.cat_id = '11' 
    ORDER BY m.mo_number DESC 

Ich weiß nicht, wie die Abfrage zu schreiben, so dass dieser Job nicht angezeigt in der Tabelle nach oben als immer noch offen. Ich würde mich freuen, wenn jemand helfen kann.

Antwort

0

SQL Fiddle

MySQL 5.5 Schema Einrichtung:

create table users (user_id int, first_name varchar(100), last_name nvarchar(100)); 
insert users (user_id, first_name, last_name) 
select 1, 'John', 'Smith' 
union 
select 5, 'Neo', 'Anderson' 
; 

create table category (cat_id int, name varchar(100)); 
insert category (cat_id, name) 
select 1, 'closed' 
union 
select 2, 'not so closed but not open too :)' 
union 
select 11, 'open' 
; 

create table master (
    id int, mo_number varchar(10), part_number varchar(10), serial_number varchar(10), 
    cat_id int, date_created date, user_id int, comment varchar(100)); 

insert master (id, mo_number, part_number, serial_number, cat_id, date_created, user_id, comment) 
select 15, '7200023', '347893', 'SN00001', 11, '2016-03-01', 1, 'seems we can do it' 
union 
select 33, '7200023', '347893', 'SN00001', 1, '2016-03-10', 5, 'tested by Morpheus' 
union 
select 34, '7200045', '457890', 'SN00002', 11, '2016-03-11', 1, 'again that Miss drop it to bath ' 

Abfrage 1:

SELECT m.mo_number, m.part_number, m.serial_number, m.comment, 
    m.date_created, CONCAT(u.first_name, ' ', u.last_name) as name 
FROM master AS m 
    INNER JOIN users as u ON u.user_id = m.user_id 
    INNER JOIN category as c ON m.cat_id = c.cat_id 
WHERE m.cat_id = 11 and not exists(
    select 1 from master as m1 
    where m1.cat_id <> 11 
    and m1.date_created > m.date_created 
    and m1.mo_number = m.mo_number) 
ORDER BY m.mo_number DESC 

Results:

+0

Vielen Dank shibormat für Ihre Antwort, ich habe den Hauptbeitrag bearbeitet, um Ihnen die tatsächliche Auswahl Abfrage, die ich habe. Weil ich einen inneren Join habe und ich versucht habe, deine Anfrage an meine anzupassen, aber es hat nicht funktioniert. Also poste ich meine ganze Auswahlfrage. – Brume007

+0

nur hinzufügen, wo 'und nicht existiert (wählen Sie 1 von Master als m1 wo m1.user_id = '1' und m1.cat_id = 1 und m1.date> m.date und m1.part_number = m.part_number)' – shibormot

+0

Hallo Shibormot, ich habe meine Frage aktualisiert, ich denke, ich war nicht klar in erster Linie, bitte analysieren Sie es erneut und geben Sie mir eine Lösung. Ich würde es demütig schätzen. – Brume007