#mysql #filter #union #sql-like
#mysql #Фильтр #объединение #sql-подобный
Вопрос:
Я обновил таблицу «оставить»:
-------- --------- --------- ------------- ---------- ----------
|ID_LEAVE|ID_WORKER| BEGIN_DATE | END_DATE |
-------- --------- --------- --------- ------------- -----------
| 5 | 10 | 2019-03-22 07:00:00 |2019-03-25 15:00:00 |
-------- --------- --------- ------------- ---------- ----------
| 6 | 10 | 2019-03-28 07:00:00 |2019-04-12 15:00:00 |
-------- --------- --------- ------------- ---------- ----------
| 7 | 12 | 2019-03-28 07:00:00 |2019-04-09 15:00:00 |
-------- --------- --------- ------------- ---------- ----------
И «Рабочая таблица»:
--------- --------- -------
|ID_WORKER| FNAME | LNAME |
--------- --------- -------
| 10 | MARIO | NEED |
--------- --------- -------
| 12 | DARIO | MARCO |
--------- --------- -------
Я могу отобразить всех работников (все из «таблицы workers») с указанием времени выхода.
Что я хотел бы сделать?
Я хочу фильтровать фразы FNAME OR LNAME
, к которым присоединяется таблица workers.
Что я пробовал?
Я попытался фильтровать фразы FNAME OR LNAME
по коду ниже:
SELECT leave.ID_LEAVE, leave.ID_WORKER, workers.FNAME, workers.LNAME, leave.BEGIN_DATE, leave.END_DATE,
FROM
(SELECT ADDDATE('1970-01-01', t4 * 10000 t3 * 1000 t2 * 100 t1 * 10 t0) AS date_value
FROM
(SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
(SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
(SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
(SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) calendar
INNER JOIN leave ON calendar.date_value BETWEEN DATE(leave.BEGIN_DATE) AND DATE(leave.END_DATE)
INNER JOIN workers ON leave.ID_WORKER = workers.ID_WORKER
WHERE NOT WEEKDAY(date_value) IN (5, 6) AND (workers.FNAME LIKE 'Ma' OR workers.LNAME LIKE 'Ma')
GROUP BY ID_LEAVE;
Но это ничего не показывает. Когда я фильтрую LNAME или FNAME, написав фразу «Ma», он будет отображать любой подобный контент:
-------- --------- --------- ------------- ---------- --------------------------
|ID_LEAVE|ID_WORKER| FNAME | LNAME | BEGIN_DATE | END_DATE |
-------- --------- --------- --------- ------------- -------------------- ------
| 5 | 10 | MARIO | NEED |2019-03-22 07:00:00 |2019-03-25 15:00:00 |
-------- --------- --------- ------------- ---------- --------------------------
| 6 | 10 | MARIO | NEED |2019-03-28 07:00:00 |2019-04-09 15:00:00 |
-------- --------- --------- ------------- ---------- --------------------------
Есть идеи? Что я должен изменить в этом коде? Могу ли я рассчитывать на вашу поддержку? Спасибо за любые советы.
Ответ №1:
Вы пропустили символ ‘%’ в условии фильтра. Также вы должны использовать функцию UPPER() для поля и сравниваемых данных, чтобы фильтрация не учитывала регистр
SELECT leave.ID_LEAVE, leave.ID_WORKER, workers.FNAME, workers.LNAME, leave.BEGIN_DATE, leave.END_DATE,
FROM
(SELECT ADDDATE('1970-01-01', t4 * 10000 t3 * 1000 t2 * 100 t1 * 10 t0) AS date_value
FROM
(SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
(SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
(SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
(SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) calendar
INNER JOIN leave ON calendar.date_value BETWEEN DATE(leave.BEGIN_DATE) AND DATE(leave.END_DATE)
INNER JOIN workers ON leave.ID_WORKER = workers.ID_WORKER
WHERE NOT WEEKDAY(date_value) IN (5, 6) AND (UPPER(workers.FNAME) LIKE '%MA%' OR UPPER(workers.LNAME) LIKE '%MA%')
GROUP BY ID_LEAVE;
Комментарии:
1. Что-то подобное происходит, когда я чувствую себя спящим. Спасибо за помощь
Ответ №2:
Вы можете попробовать этот запрос
select leave.ID_LEAVE,
Workers.ID_WORKER,
Workers.FNAME,
Workers.LNAME,
leave.BEGIN_DATE,
leave.END_DATE from Workers
join leave on Workers.ID_WORKER = leave.ID_WORKER
where Workers.FNAME Like '%ma%';