2010-11-19 2 views
0

Meine Datenbank besteht aus 2 Tabellen. Ich benutze MySQL.sql select, bekommen Autos, die eine Arbeit fällig sind

Tabelle 1

Autos = id (int, primaryKey), reg (int), Typ (int)

Tabelle 2

Jobs = ref (int, primaryKey), ID (int), Datum (Datum)

Ich brauche eine SELECT-Anweisung, die mir alle Autos bekommen würde, die in den letzten 3 Wochen keine Arbeit hatten.

(dh. Wenn ein Auto, einen Job in den letzten 3 Wochen nicht gehabt hat, dann ist das Auto (id) würde zurückgegeben werden)

ich dort kennen verschiedene Wege wäre dies bin ich jedoch nicht bis Geschwindigkeit in SQL noch: <

Antwort

2

Dies ist ein guter Anwendungsfall für NOT EXISTS:

select c.id,c.reg,c.type 
from cars c 
where not exists 
(
    select NULL 
    from jobs j 
    where j.id = c.id 
    and j.date >= CURRENT_DATE - INTERVAL 3 WEEK 
); 
+0

Hallo danke das macht es perfekt. – brux

0

Ich weiß nicht, welchen Geschmack von Oracle Sie verwenden, aber das würde auf Oracle funktionieren. In anderen Geschmacksrichtungen müssten Sie Ihr Datum anders ausarbeiten (und vielleicht ist die Joinsyntax ein wenig anders).

select * 
from cars c 
left join jobs j 
    on j.id = c.id 
where j.date < sysdate - 21 
+0

im MySQL-Datenbank verwenden – brux

+0

Selbst wenn Sie 'sysdate-21' in MySQL übersetzen, wird es Ihnen nicht die gewünschten Daten geben. Dies wird Autos zurückgeben, die vor mehr als 3 Wochen einen Job hatten, und keine Autos ohne Job in den letzten 3 Wochen. –

+0

Nun, es gibt alles zurück, was in den letzten 3 Wochen keinen Job hatte. Einschließlich Autos, die überhaupt keine Arbeit hatten. Nicht was angefordert wurde, denke ich. – gnuchu

0

Wenn die Verbindung zwischen den beiden Tabellen die jobs.ref ist, dann könnte die SQL so aussehen:

select id from cars where id in 
    (select ref from jobs where date < DATE_SUB(NOW(),INTERVAl 21 DAY) 
+0

die Verbindung zwischen Tabellen, wenn tatsächlich ID (int) – brux

+0

Dies wird Autos zurückgeben, die eine Arbeit vor mehr als 3 Wochen hatten. Was das OP will, ist Autos zu sehen, die ** in den letzten 3 Wochen keine Arbeit hatten. –