2016-06-09 6 views
1

Это мой запрос:Какой должен быть правильный запрос?

SELECT 
    employee.name, 
    employee.type, 
    employee.rate, 
    work.overtime, 
    work.leaves, 
    work.ticket 
FROM employee 
    LEFT JOIN work ON employee.name = work.name 
WHERE work.date BETWEEN :date1 and :date2 
HAVING employee.type = :type_emp 

Но это не работает. Я хочу получить список сотрудников определенного типа, и их рабочий статус должен отображаться с даты 1 до даты. 2.

Как это сделать?

+0

какая ошибка вы получаете? – Asad

ответ

2

Вы пробовали:

SELECT 
    `employee`.name, 
    `employee`.type, 
    `employee`.rate, 
    `work`.overtime, 
    `work`.leaves, 
    `work`.ticket 
FROM `employee` 
    LEFT JOIN `work` ON `employee`.name = `work`.name 
         AND (`work`.date BETWEEN :date1 AND :date2) 
WHERE `employee`.type = :type_emp 
+0

Это сработало! Благодаря! –

0
SELECT employee.name, employee.type, employee.rate, work.overtime, work.leaves, work.ticket 
FROM employee 
LEFT JOIN work on employee.name=work.name 
    AND work.date between :date1 and :date2 
WHERE employee.type=:type_emp 

Есть 2 проблемы в оригинальной

  • в котором условия оговорка на левой присоединился таблице принудительно эквивалент внутреннего соединения, так если между датами нет работы, ничего не отображается вообще. Чтобы исправить это, переместите фильтрацию даты в «условие соединения», а не в предложении where
  • предложение о предложениях не является заменой предложения where; предложение предложения предназначено для фильтрации по агрегированным значениям, возникающим из предложения group by. Чтобы исправить это, просто используйте предложение where.

Существует еще одна потенциальная проблема в том, что между ними не лучший способ фильтровать диапазоны дат, вместо этого следующий подход часто лучше. НО: date2 становится «на следующий день» из того, что вы используете сейчас.

SELECT employee.name, employee.type, employee.rate, work.overtime, work.leaves, work.ticket 
FROM employee 
LEFT JOIN work on employee.name=work.name 
    AND work.date >= :date1 AND work.date < :date2 
WHERE employee.type=:type_emp 
0

Заменить ', имеющий' с 'и' (без кавычек)

0

оба условия в положение, где будет вызываться с помощью оператора AND. Попробуйте следовать

SELECT employee.name, employee.type, 
employee.rate, work.overtime, work.leaves, work.ticket 
FROM employee LEFT JOIN work 
ON employee.name=work.name 
WHERE employee.type=:type_emp AND 
work.date between :date1 and :date2 
Смежные вопросы