Как фильтровать fname и lname? - MySQL - PullRequest
0 голосов
/ 12 апреля 2019

Я обновил таблицу «выхода»:

+--------+---------+---------+-------------+----------+----------+
|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 |
+---------+---------+-------+

Я могу отобразить всех работников (все из «рабочего стола») с указанием времени отпуска.

Что я хотел бы сделать?

Я хочу фильтровать фразы FNAME OR LNAME, которые объединяются с рабочим столом.

Что я пробовал?

Я пробовал фильтровать фразы 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  | 
+--------+---------+---------+-------------+----------+-------------------------- 

Есть идеи? Что я должен изменить в этом коде? Могу ли я рассчитывать на вашу поддержку? Спасибо за любой совет.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Вы пропустили символ «%» в условии фильтра.Также вы должны использовать функцию 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;
0 голосов
/ 12 апреля 2019

Вы можете попробовать этот запрос

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%';
...