Mysql 产生错误计数结果的SQL查询

Mysql 产生错误计数结果的SQL查询,mysql,sql,Mysql,Sql,我有以下SQL查询 SELECT DISTINCT count("SiteTree_Live"."ID") FROM "SiteTree_Live" LEFT JOIN "Page_Live" ON "Page_Live"."ID" = "SiteTree_Live"."ID" LEFT JOIN "TourPage_Live" ON "TourPage_Live"."ID" = "SiteTree_Live"."ID" LEFT JOIN "DepartureDa

我有以下SQL查询

SELECT
  DISTINCT
  count("SiteTree_Live"."ID") 
FROM  
  "SiteTree_Live"
  LEFT JOIN "Page_Live" ON "Page_Live"."ID" = "SiteTree_Live"."ID"
  LEFT JOIN "TourPage_Live" ON "TourPage_Live"."ID" = "SiteTree_Live"."ID"
  LEFT JOIN "DepartureDate" ON "DepartureDate"."TourID" = "SiteTree_Live"."ID"
WHERE 
  ("SiteTree_Live"."Locale" = 'en_AU')
  AND ("SiteTree_Live"."ClassName" IN ('TourPage'))
  AND ("DepartureDate"."DepartureDate" LIKE '2012-11%')
但是它产生了一个错误的计数作为查询结果。该查询预期返回的总结果不应超过245个,但目前,其返回的结果大约超过“4569”个

这是因为“DepartureDate”表上的联接,因为当我从“DepartureDate”表中删除联接时,查询返回预期结果

我需要对我的查询进行哪些修改,以计算“SiteTree\u Live”、“ID”和“出发日期”、“TourID”之间的Macthes,而只计算“SiteTree\u Live”、“ID”计数,不包括出发日期

欢迎任何建议:)

答案

SELECT 
COUNT(DISTINCT SiteTree_Live.ID) 
FROM 
"SiteTree_Live" LEFT JOIN "Page_Live" ON "Page_Live"."ID" = "SiteTree_Live"."ID" 
LEFT JOIN "TourPage_Live" ON "TourPage_Live"."ID" = "SiteTree_Live"."ID" 
LEFT JOIN "DepartureDate" ON "DepartureDate"."TourID" = "SiteTree_Live"."ID" 
WHERE 
("SiteTree_Live"."Locale" = 'en_AU') 
AND ("SiteTree_Live"."ClassName" IN ('TourPage'))
AND ("DepartureDate"."DepartureDate" LIKE '2013-03%')
似乎给了我正确的结果。感谢@Michael Berkowski提供的提示做这件事(你有很多不必要的连接)

您也可以通过以下方式进行分组:

SELECT 
  COUNT(SiteTree_Live.ID) 
FROM 
  `SiteTree_Live`
LEFT JOIN 
  `DepartureDate` ON `DepartureDate`.`TourID` = `SiteTree_Live`.`ID` 
WHERE 
  `SiteTree_Live`.`Locale` = 'en_AU'
  AND `SiteTree_Live`.`ClassName` = 'TourPage'
  AND `DepartureDate`.`DepartureDate` LIKE '2013-03%'
GROUP BY
  SiteTree_Live.ID

轻微更正:如果
DepartureDate
是一种日期类型,那么像'2013-03%这样的
将强制将其强制为字符类型(这是mysql功能),因此,
DepartureDate
上的任何索引都不会被使用,IIRC。最好使用普通范围查询:

SELECT 
  COUNT(DISTINCT stl.ID) 
FROM 
  SiteTree_Live stl
LEFT JOIN 
  DepartureDate dd ON dd.TourID = stl.ID 
WHERE 
  stl.Locale = 'en_AU'
  AND stl.ClassName = 'TourPage'
  AND dd.DepartureDate >= '2013-03-01'
  AND dd.DepartureDate < '2013-04-01'
   ;
选择
计数(不同的stl.ID)
从…起
现场树
左连接
出发日期dd.TourID=stl.ID
哪里
stl.Locale='en_AU'
和stl.ClassName='TourPage'
和dd.DEPAREUREDATE>=“2013-03-01”
和dd.出发日期<'2013-04-01'
;

您的意思是
计数(DISTINCT SiteTree\u Live.ID)
而不是
DISTINCT COUNT()
?这是否有效?你所有的双引号都应该是反勾号。这个
DepartureDate
是字符类型吗?@MichaelBerkowski COUNT(DISTINCT SiteTree_Live.ID)似乎给了我想要的。干杯谢谢:)@Barmar是的,它确实有效。选择这个作为答案,稍加编辑。谢谢@wildplasser
SELECT 
  COUNT(DISTINCT stl.ID) 
FROM 
  SiteTree_Live stl
LEFT JOIN 
  DepartureDate dd ON dd.TourID = stl.ID 
WHERE 
  stl.Locale = 'en_AU'
  AND stl.ClassName = 'TourPage'
  AND dd.DepartureDate >= '2013-03-01'
  AND dd.DepartureDate < '2013-04-01'
   ;