SQL Fetch строк, если он удовлетворяет всем критериям

mysql sql codeigniter

52 просмотра

2 ответа

У меня здесь таблица для расписания 2 сотрудников. Как я буду получать строки определенного сотрудника , который имеет полное расписание с понедельника по воскресенье и начинается от 2016-08-15 ДО 2016-08-21

| id | emp_id |    date    | day |
|----|--------|------------|-----|
| 1  |  emp1  | 2016-08-17 | Wed |
| 2  |  emp1  | 2016-08-18 | Thu |
| 3  |  emp1  | 2016-08-19 | Fri |
| 4  |  emp1  | 2016-08-20 | Sat |
| 5  |  emp1  | 2016-08-21 | Sun |
| 6  |  emp2  | 2016-08-15 | Mon |
| 7  |  emp2  | 2016-08-16 | Tue |
| 8  |  emp2  | 2016-08-17 | Wed |
| 9  |  emp2  | 2016-08-18 | Thu |
| 10 |  emp2  | 2016-08-19 | Fri |
| 11 |  emp2  | 2016-08-20 | Sat |
| 12 |  emp2  | 2016-08-21 | Sun |

Так что, в основном, он должен извлекать только записи emp 2. Вот как должен быть вывод

| 6  |  emp2  | 2016-08-15 | Mon |
| 7  |  emp2  | 2016-08-16 | Tue |
| 8  |  emp2  | 2016-08-17 | Wed |
| 9  |  emp2  | 2016-08-18 | Thu |
| 10 |  emp2  | 2016-08-19 | Fri |
| 11 |  emp2  | 2016-08-20 | Sat |
| 12 |  emp2  | 2016-08-21 | Sun |

Но если у emp1 есть расписание на понедельник и вторник, его также следует извлечь.

ОБНОВЛЕНО

На самом деле я применяю это в codeigniter и с помощью ответов мне удалось перевести его в синтаксис активной записи codeigniter, и вот как выглядит мой код:

$schedule = $this->db->query("SELECT *
                FROM schedule
                LEFT JOIN employees
                ON employees.user_id = schedule.user_id;
                WHERE schedule.user_id IN (SELECT user_id
                                   FROM schedule
                                   WHERE start >= '2016-08-15' and start <= '2016-08-21'
                                   group by user_id
                                   having count(*) = 7
                                  ); ");


if($schedule->num_rows() > 0) {
    return $schedule->result_array();
    } else {
        return false;
    }

Кстати, у меня также есть еще одна таблица, которая должна быть объединена с таблицей расписания. Но это, кажется, неправильно, потому что я получил ошибку. Как я должен решить это?

Автор: Pretorian Источник Размещён: 08.11.2019 11:14

Ответы (2)


2 плюса

Решение

Наличие полного графика от 2016-08-15до 2016-08-21означает, что запланировано семь дней. Таким образом, вы можете просто проверить количество дней, запланированных на этот период, и убедиться, что у вас есть семь (разных):

SELECT *
FROM   schedule
WHERE  `date` >= '2016-08-15' AND 
       `date` <= '2016-08-21' AND
       emp_id IN (SELECT   emp_id
                  FROM     schedule
                  WHERE    `date` >= '2016-08-15' AND `date` <= '2016-08-21'
                  GROUP BY emp_id
                  HAVING   COUNT(DISTINCT `date) = 7)
Автор: Mureinik Размещён: 20.08.2016 11:36

1 плюс

Делает ли это то, что вы хотите?

select emp_id
from t
where date >= '2016-08-15' and date <= '2016-08-21'
group by emp_id
having count(*) = 7;

Чтобы получить подробные записи, вы можете использовать join, inили exists:

select t.*
from t
where t.emp_id in (select emp_id
                   from t
                   where date >= '2016-08-15' and date <= '2016-08-21'
                   group by emp_id
                   having count(*) = 7
                  );
Автор: Gordon Linoff Размещён: 20.08.2016 11:37
Вопросы из категории :
32x32