【问题标题】:Modifying query with multiple subqueries to use JOIN [closed]使用多个子查询修改查询以使用 JOIN [关闭]
【发布时间】:2017-02-02 07:08:22
【问题描述】:

我想修改以下查询以删除子查询并改为使用 JOIN 构造

SELECT COUNT(locationid) FROM Passages WHERE PassageTime <= 1485924396 
AND LicenceTag NOT IN (SELECT LicenceTag FROM participant_licencetag WHERE FROM_UNIXTIME(passagetime) BETWEEN from_datetime AND to_datetime) 
AND LocationId NOT IN (SELECT LocationId FROM imagefetchrequests WHERE passagetime BETWEEN StartTime AND EndTime);  

以下是我使用 JOIN 创建的查询,但结果与初始查询的结果无法比较

SELECT COUNT(p.locationid) FROM Passages p
LEFT JOIN participant_licencetag pl ON p.LicenceTag = pl.LicenceTag
LEFT JOIN imagefetchrequests ifr ON p.LocationId = ifr.LocationId 
WHERE p.PassageTime <= 1485924396
AND pl.LicenceTag IS NULL AND ifr.LocationId IS NULL 
AND FROM_UNIXTIME(p.passagetime) BETWEEN pl.from_datetime AND pl.to_datetime
AND p.passagetime BETWEEN ifr.StartTime AND ifr.EndTime;

可能出了什么问题?

【问题讨论】:

标签: mysql join subquery left-join


【解决方案1】:

将条件作为左连接表的一部分保留在 on 子句中

这样的……

SELECT COUNT(p.locationid) FROM Passages p
LEFT JOIN participant_licencetag pl ON p.LicenceTag = pl.LicenceTag AND FROM_UNIXTIME(p.passagetime) BETWEEN pl.from_datetime AND pl.to_datetime
LEFT JOIN imagefetchrequests ifr ON p.LocationId = ifr.LocationId AND p.passagetime BETWEEN ifr.StartTime AND ifr.EndTime
WHERE p.PassageTime <= 1485924396
AND pl.LicenceTag IS NULL AND ifr.LocationId IS NULL;

【讨论】:

  • 你也可以试试这个 SELECT COUNT(*) FROM ( SELECT COUNT(p.locationid) FROM Passages p LEFT JOINparticipant_licencetag pl ON p.LicenceTag = pl.LicenceTag WHERE p.PassageTime
猜你喜欢
  • 2015-11-14
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多