簡體   English   中英

MySQL左連接並選擇

[英]MySQL left join and select

我有兩個表,mytable1和mytable2。 我從mytable1獲得結果,並與mytable2保持連接。

CREATE TABLE mytable1 
    ( userid int, 
     type int, 
     datetime1 DATETIME );
CREATE TABLE mytable2
    ( userid int,
     name varchar(20),
     day2 DATE,
     time2 TIME );

SELECT x.*, d.name, d.day2, d.time2
  FROM ( SELECT * FROM mytable1 WHERE TYPE=1 ORDER BY userid ASC LIMIT 0,50) x
   LEFT JOIN mytable2 d
   ON x.userid = d.userid

但是我需要過濾結果,因此,如果“ mytable2.day2 mytable2.time2”大於2天前,我將僅獲得結果。 例如,讓datetime為“ 2014.03.27 21:00:00”。 如果mytable2記錄比“ 2014.03.27 21:00:00”新,我將得到結果

您可以在此處檢查sql小提琴: http ://sqlfiddle.com/#!2/a5364/2
我的試用版: http ://sqlfiddle.com/#!2/a5364/5

這是查詢的樣子:-

select x.*, d.name, d.day2, d.time2
from ( SELECT * FROM mytable1 WHERE type=1 ORDER BY userid ASC LIMIT 0,50) x
left join mytable2 d
on x.userid = d.userid
where ( convert(CONCAT(d.day2,' ',d.time2),datetime) >= SUBDATE(curdate(),INTERVAL 2 DAY))

使用convert()獲取日期時間,然后使用subdate()查找2天之前的日期。

在您提供的SQL Fiddle上進行驗證。

現在的問題是:如果沒有記錄,在所有的mytable2在匹配記錄中mytable1 ,你還想看mytable1記錄? 如果是這樣,請將條件移至on子句:

  select x.*, d.name, d.day2, d.time2
  from (SELECT *
        FROM mytable1
        WHERE type = 1
        ORDER BY userid ASC
        LIMIT 0,  50
       ) x left join
       mytable2 d
       on x.userid = d.userid and
          (d.day2 + d.time2) >= DATE_SUB(NOW(), INTERVAL 2 DAY);

否則,您可以將聯接更改為inner join

  select x.*, d.name, d.day2, d.time2
  from (SELECT *
        FROM mytable1
        WHERE type = 1
        ORDER BY userid ASC
        LIMIT 0, 50
       ) x join
       mytable2 d
       on x.userid = d.userid
  where (d.day2 + d.time2) >= DATE_SUB(NOW(), INTERVAL 2 DAY);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM