MySQL оставил соединения с диапазоном дат - PullRequest
0 голосов
/ 14 ноября 2011

Нужно выполнить запрос, используя несколько левых соединений.Следующий запрос работает.

SELECT directory.location, sales.covers, labor.hours
FROM t_directory directory
LEFT JOIN t_sales sales
ON sales.id = directory.id
AND sales.business_date = '2011-11-14'
LEFT JOIN t_labor labor
ON labor.id = directory.id
AND labor.business_date = '2011-11-14'
ORDER BY directory.id ASC

Проблема возникает, если я пытаюсь выполнить запрос в диапазоне дат.Добавление предложения Group By дублировало строки.Сейчас я на самом деле использую два отдельных запроса, что, вероятно, является лучшей практикой и лучшим решением.Это просто из чистого любопытства на данный момент.

Вот что у меня так далеко.

 SELECT directory.location, sales.covers, labor.hours
 FROM t_directory directory
 LEFT JOIN t_sales sales
 ON sales.id = directory.id
 AND sales.business_date BETWEEN '2011-11-13' AND '2011-11-14'
 LEFT JOIN t_labor labor
 ON labor.id = directory.id
 AND labor.business_date BETWEEN '2011-11-13' AND '2011-11-14'
 GROUP BY directory.id, sales.business_date, labor.business_date
 ORDER BY directory.id ASC

Очевидно, что что-то не так с моим предложением GROUP BY, а также, возможно, с другими ошибками.

Я ищу такой результат:

| location | covers | labor |
=============================
  loc1     |  300   | 99.40
  loc1     |  325   | 100.50
  loc2     |  250   | 89.00
  loc2     |  275   | 90.20
  loc3     |  400   | 100.00
  loc3     |  500   | 122.90

Иконечно, что я на самом деле получаю:

| location | covers | labor |
=============================
  loc1     |  300   | 99.40
  loc1     |  300   | 100.50  
  loc1     |  325   | 99.40
  loc1     |  325   | 100.50   
  loc2     |  250   | 89.00
  loc2     |  250   | 90.20
  loc2     |  275   | 89.00
  loc2     |  275   | 90.20
  loc3     |  400   | 100.00
  loc3     |  400   | 122.90
  loc3     |  500   | 100.00
  loc3     |  500   | 122.90

Любая помощь в получении ожидаемых результатов будет принята с благодарностью.

РЕДАКТИРОВАТЬ: Вот таблицы с образцами данных, к которым я хочу присоединиться.Все они имеют общий идентификатор.

t_directory
| *id | location | 
|100  |   loc1   |
|101  |   loc2   |
|102  |   loc3   |

t_sales
| business_date | id | sales    | covers |
|  2011-11-13   | 103| 4000.00  | 300    |
|  2011-11-14   | 103| 4050.00  | 325    |

t_labor
|business_date | id | hours | 
| 2011-11-13   | 103| 99.40 |
| 2011-11-14   | 103| 100.50|

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Ваш ожидаемый результат не имеет для меня никакого смысла. Нет никакой связи между sales и labor строками, так почему же значение covers 300 должно идти рядом со значением labor 99.40? Что связывает эти два значения вместе? Вот почему вам трудно написать запрос для получения результатов: вы пытаетесь вывести два столбца, где данные в каждом не связаны.

Я, наверное, не очень хорошо объяснил это. Я уверен, что кто-то еще может!

0 голосов
/ 14 ноября 2011

Предварительно запросите группу по отчету по продажам / трудовым ресурсам, ПОТОМ оставив присоединиться к ним. Если у вас есть несколько строк в одной таблице, ложно ли это портит количество возвращаемых записей и, следовательно, результаты ... Попробуйте

select STRAIGHT_JOIN
      PreQualifiedIDAndDate.ID,
      PreQualifiedIDAndDate.business_date,
      directory.location, 
      PreQuerySales.TotalCovers, 
      PreQueryLabor.TotalHours
   FROM 
      ( select distinct 
              sales.ID,
              sales.Business_Date
           from t_sales sales
           where sales.business_date between  '2011-11-13' AND '2011-11-14'
        UNION
        select labor.ID,
              labor.Business_Date
           from t_labor labor
           where labor .business_date between  '2011-11-13' AND '2011-11-14' )
         as PreQualifiedIDAndDate

         JOIN t_directory directory
            on PreQualifiedIDAndDate.ID = directory.ID

         LEFT JOIN
         ( select sales.ID,
                  sales.business_Date,
                  sum(sales.covers) TotalCovers
              from t_sales sales
              where sales.business_date between  '2011-11-13' AND '2011-11-14'
              group by sales.ID, sales.Business_Date ) PreQuerySales
            on PreQualifiedIDAndDate.ID = PreQuerySales.ID
            AND PreQualifiedIDAndDate.Business_Date = PreQuerySales.Business_Date

         LEFT JOIN 
         ( select labor.ID,
                  labor.Business_Date,
                  sum( labor.hours ) TotalHours
              from t_labor labor
              where labor.business_date between  '2011-11-13' AND '2011-11-14'
              group by labor.ID, labor.Business_Date ) PreQueryLabor
            on PreQualifiedIDAndDate.ID = PreQueryLabor.ID
            AND PreQualifiedIDAndDate.Business_Date = PreQueryLabor.Business_Date

   GROUP BY 
      PreQualifiedIDAndDate.id,
      PreQualifiedIDAndDate.Business_Date
   ORDER BY 
      directory.id
...