2017-02-03 2 views
-1

Ich versuche herauszufinden, wie kann ich meine Abfrage mit mehr als 1 Zeile in meiner Where-Klausel ohne die Verwendung der in() und any(), weil meine aktuelle Datenbank nicht unterstützt diese Funktionen. Zur Zeit habe ich diese AbfrageMySQL Unterabfrage gibt mehr als 1 Zeile in WHERE Klausel

select crack_id 
from gndmeas 
where timestamp = (select distinct timestamp 
        from gndmeas 
        where site_id='agb' 
        order by timestamp desc limit 10 
       ); 

die Unterabfrage besteht aus

+---------------------+ | timestamp | +---------------------+ | 2017-01-13 08:15:00 | | 2017-01-10 07:00:00 | | 2017-01-06 08:30:00 | | 2017-01-03 10:00:00 | | 2016-12-27 09:25:00 | | 2016-12-20 07:30:00 | | 2016-12-13 07:35:00 | | 2016-12-09 08:10:00 | | 2016-12-06 07:40:00 | | 2016-12-02 07:00:00 | +---------------------+

und ich möchte für die where-Klausel eine Auswahlabfrage mit den Daten zu tun. Ist es möglich, ohne die any() und in() Funktionen von mysql auszuführen?

Vielen Dank im Voraus.

+0

können Sie –

+0

verwenden beitreten Sie können versuchen, 'EXISTS' zu verwenden. –

Antwort

1

können Sie mitmachen.

select a.crack_id from gndmeas a join (select distinct timestamp from 
    gndmeas where site_id='agb' order by timestamp desc limit 10) b 
    on a.timestamp=b.timestamp 
0

Sie haben mindestens zwei Möglichkeiten.

Verwenden Sie eine temporäre Tabelle und speichern Sie die Zeitstempel in der temporären Tabelle zuerst. Führen Sie einen inneren Join mit der temporären Tabelle durch, um Datensätze in der Haupttabelle zu filtern.

Wenn mysql erlaubt (ich bin nicht sicher), verwenden Sie eine geschachtelte Tabelle als Teil der inneren Join.

+0

yeah Temporäre Tabelle ist eine Option, aber nur in einem Fall der gespeicherten Prozedur ... Benutzer möchte nicht sp ... er will einzelne Abfrage –

1

Versuchen Sie, diese

select a.crack_id 
from gndmeas a 
inner join 
(select distinct timestamp 
        from gndmeas 
        where site_id='agb' 
        order by timestamp desc limit 10 
       )as b 
on a.timestamp = b.timestamp 
+0

Sie wollen ein 'INNER JOIN', nicht ein' LINKER JOIN', hier , weil nicht übereinstimmende Datensätze herausgefiltert werden sollten. –

+0

@TimBiegeleisen Danke –

0

Mit linken äußeren Join Join-Tabelle mit:

select crack_id 
from gndmeas G 
left outer join gndmeas G1 on G.timestamp=G1.timestamp 
where G.site_id='agb' 
order by G.timestamp desc limit 10 

Distinct crack_id von group by-Klausel:

select crack_id 
from gndmeas G 
left outer join gndmeas G1 on G.timestamp=G1.timestamp 
where G.site_id='agb' 
group by G.crack_id 
order by G.timestamp desc limit 10 
Verwandte Themen