2016-05-05 4 views
0
table : transmission 
-------------------------------------------------------- 
    ID  ReqString   Timestamp   Actif 
------- ------------- --------------------- -------- 
    a   O21   2016-05-02 10:03:27  1 
    a   O20   2016-05-01 11:07:47  1 
    a   O11   2016-05-02 09:27:53  1 

    b   O20   2016-05-02 12:27:45  1 
    b   O21   2016-05-01 09:32:55  1 

ich abrufen müssen, für die gleiche ID, die neuesten Werte für ReqString wie O2% UND WIE O1%welche Art von Abfrage zu verwenden, um dies zu bekommen (links Arbeits join nicht)

ich versucht habe, das LINKE JOIN. Diese Abfrage funktioniert, wenn ich einen Wert in t1, aber nicht arbeiten, wenn ich keinen Wert für die Tabelle t1 haben ...

SELECT t1.ReqString AS O1, t2.ReqString AS O2, t1.Timestamp AS T1, t2.Timestamp AS T2 
FROM transmission t1 
LEFT JOIN transmission t2 ON t2.ID = t1.ID 
         AND t2.ReqString LIKE 'O2%' 
         AND t2.Actif=1 
WHERE t1.ID = 'b' 
    AND t1.ReqString LIKE 'O1%' 
    AND t1.Actif = 1 
ORDER BY t1.Timestamp DESC, t2.Timestamp DESC 
LIMIT 1 

Also, wenn ich die Abfrage für die ID-run = ‚a‘, ich muss

------------------------------------------------------------------------ 
    O1  O2    T1       T2 
------- --------- ----------------------- ------------------------- 
    O11  O21  2016-05-02 09:27:53  2016-05-02 10:03:27 

bekommen und wenn ich es für die ID = 'b' laufen, das Ergebnis wäre ich haben möchte ist

------------------------------------------------------------------------ 
    O1  O2    T1       T2 
------- --------- ----------------------- ------------------------- 
NULL  O20    NULL     2016-05-02 12:27:45 
+0

Was ist, wenn es in t2 keinen Wert gibt? – ChiefTwoPencils

+0

eigentlich, wenn ich keinen Wert in t2 habe, bin ich ok mit der linken Join ... – sincos

+1

Sie fragen nach mehr als einer Abfrage. Der linke Join tut nicht das, was Sie brauchen, wenn in t1 kein Wert ist. Klingt für mich so, als ob Sie einen vollständigen Join möchten, bei dem Sie alle Übereinstimmungen jeder Anforderungszeichenfolge erhalten; Wenn die andere Tabelle keine Übereinstimmung hat, erhalten Sie für die Tabelle t1 oder t2 null. – ChiefTwoPencils

Antwort

0
select t1.ReqString AS O1, t2.ReqString AS O2, t1.Timestamp AS T1, t2.Timestamp AS T2 from 
(SELECT ReqString , Timestamp 
FROM transmission where ReqString LIKE 'O1%' AND Actif=1 and ID = 'a' 
limit 1 order by Timestamp DESC)t1, 
(SELECT ReqString , Timestamp 
FROM transmission where ReqString LIKE 'O2%' AND Actif=1 and ID = 'a' 
limit 1 order by Timestamp DESC)t2 
+0

Es funktioniert nicht, wenn kein Wert für O1 oder für O2 in ReqString vorhanden ist, für beide müssen Werte vorhanden sein – sincos

0

Try this:

SELECT 
    result1.ReqString as 'O1', 
    result2.ReqString as 'O2', 
    result1.Timestamp as 'T1', 
    result2.TimeStamp as 'T2' 
FROM 
    (
    SELECT 
     @i:[email protected]+1 AS rowId, 
     ReqString, 
     Timestamp 
    FROM transmission,(SELECT @i:=0) a 
    WHERE ReqString LIKE 'O1%' 
    AND Actif=1 
    AND ID = 'a' 
    LIMIT 1 
    ORDER BY Timestamp DESC 
) as result1 

    LEFT JOIN 

    (
    SELECT 
     @j:[email protected]+1 AS rowId, 
     ReqString, 
     Timestamp 
    FROM transmission,(SELECT @j:=0) a 
    WHERE ReqString LIKE 'O2%' 
    AND Actif=1 
    AND ID = 'a' 
    LIMIT 1 
    ORDER BY Timestamp DESC 
) as result2 

    ON result1.rowId = result2.rowId; 

Ich habe das Gefühl, dass Links Join möglicherweise nicht das sein, was Sie suchen. Dies sollte das gewünschte Ergebnis liefern, unabhängig davon, ob in result1 ein Wert vorhanden ist oder nicht. Wenn es das erforderliche Ergebnis nicht liefert, lassen Sie mich wissen, was falsch ist.