2

次の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」テーブルの JOIN が原因です。

"SiteTree_Live"."ID" と "DepartureDate"."TourID" の間の Macthes をカウントし、出発日を除いて "SiteTree_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

4

2 に答える 2

1

これを行います(不要な結合がたくさんあります)

SELECT 
  COUNT(DISTINCT 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 を実行することもできます。

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
于 2013-04-10T19:25:32.520 に答える
1

軽微な修正:DepartureDateが日付型の場合、LIKE '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'
   ;
于 2013-04-10T19:35:42.167 に答える