2017-05-23 5 views
-2

Ich habe zwei SQL-Abfragen.Left Exklusive JOIN funktioniert nicht

Select * from users (Returns 74 rows) 

id  firstname  lastname 
1  vignesh   km 
2  hariram   v 
3  vijesh   g 
. 
. 
74  ram    k 


Select * from details where time between '2017-05-11 00:00:00' AND '2017-05-11 23:59:59' (Returns 5 row). 


id  userid  logindate 
57  1   2017-05-11 09:07:23 
63  3   2017-05-11 09:04:57 
65  6   2017-05-11 09:14:45 
83  13   2017-05-11 09:26:43 
65  74   2017-05-11 09:11:53 

ich versuchte

SELECT * 
FROM details dt LEFT JOIN users us ON us.id = dt.userid 
WHERE dt.logindate BETWEEN '2017-05-11 00:00:00' AND '2017-05-11 23:59:59' OR dt.userid IS NULL 
GROUP BY dt.userid; (6 rows returning - in that one row contains full of null) 

UND

SELECT * 
FROM details dt LEFT JOIN users us ON us.id = dt.userid 
WHERE dt.logindate BETWEEN '2017-05-11 00:00:00' AND '2017-05-11 23:59:59' 
GROUP BY dt.userid; (5 rows returning) 


id  userid  logindate    firstname  lastname 
57  1   2017-05-11 09:07:23  vignesh   km 
63  3   2017-05-11 09:04:57  vijesh   g 
65  6   2017-05-11 09:14:45  ..    .. 
83  13   2017-05-11 09:26:43  ..    .. 
65  74   2017-05-11 09:11:53  ram    k 

Beide sind nicht funktioniert. Aber ich brauche die 69 Zeilen, die im ersten Abfrageergebnis verfügbar sind und im zweiten Abfrageergebnis nicht verfügbar sind.

+0

https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql -abfrage – Yunnosch

+0

'SELECT * VON details dt LINKE VERBINDEN us us us.id = dt.userid WHERE dt.userid IST NICHT NULL UND dt.logindate ZWISCHEN '2017-04-26 00:00:00' UND '2017 -04-26 23: 59: 59'' – Nimish

+0

@Nimish Sieht wie eine Antwort aus, warum schreibst du es in einen Kommentar? – Yunnosch

Antwort

2

Obwohl ich weiß nicht, warum Sie group by verwenden, wenn Sie users Datensätze abrufen möchten, die nicht in details vorhanden sind, können Sie versuchen, diese :

select * 
from users u 
left join details d on u.id = d.userid 
and d.logindate BETWEEN '2017-05-11 00:00:00' AND '2017-05-11 23:59:59' 
where d.id is null 

oder verwenden not exists

select * 
from users u 
where not exists (
    select 1 
    from details d 
    where u.id = d.userid 
    and d.logindate BETWEEN '2017-05-11 00:00:00' AND '2017-05-11 23:59:59' 
) 
-1
Select * from users us 
left join details dt on us.id=dt.userid 
WHERE dt.logindate NOT BETWEEN '2017-04-26 00:00:00' AND 
'2017-04-26 23:59:59' GROUP BY dt.userid 
+0

gibt es ein weiteres Problem in dieser Antwort. Wenn die Benutzerdetails in der Detailtabelle überhaupt nicht verfügbar sind, werde ich diesen Benutzer nicht bekommen. –

+0

Sie erhalten den Benutzer, weil es links Join ist. Wenn Benutzer nicht in Details vorhanden ist, als Sie null erhalten. Ich habe Benutzer zuerst als Details genommen. so denke ich, dass Sie Benutzer –

-1

Verwenden Sie GROUP BY nicht

SELECT * FROM details dt 
LEFT JOIN users us ON us.id = dt.userid 
WHERE dt.userid IS NOT NULL AND dt.logindate 
BETWEEN '2017-05-11 00:00:00' AND '2017-05-11 23:59:59 
+0

@down_voters erhalten werden, den gültigen Grund für down voting post. – Nimish