Как фильтровать fname и lname? — mysql

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