SQL-соединение с несколькими строками одной таблицы + фильтр по другой таблице

Я хотел бы попросить о помощи.

У меня есть это 3 таблицы в моей базе данных:

Таблица «Пользователи»:

|ID|   Name|   Surname| Status |
----------------------------------
|14 |    Joe|    Smith|     1  |
|15 |   Paul|   Taylor|     1  |
|16 | Martin|     List|     1  |

Таблица ‘user_data’:

|IDuser|     IDciselnik|       skUserValue|
--------------------
|14     |             1|   value1 text Joe|
|14     |             3|   value3 text Joe|
|14     |             4|                25|
|15     |             1|  value1 text Paul|
|15     |             3|  value3 text Paul|
|15     |             4|                26|
|16     |             1|value1 text Martin|
|16     |             3|value3 text Martin|
|16     |             4|                22|

Стол «цисельник»:

|ID|    skTitle|
--------------------
|25 |    Kosice|
|26 |  Skošicel|
|22 |    Prague|

если я хочу получить вывод, как показано ниже, со всеми пользователями:

Выход:

|userID | Name    | Surname | value_ID1          | value_ID3          |
------------------------------------------------------------------
| 14    |  Joe    |   Smith | value1 text Joe    | value3 text Joe    |
| 15    |  Paul   |  Taylor | value1 text Paul   | value3 text Paul   |
| 16    |  Martin |    List | value1 text Martin | value3 text Martin |

Я знаю, я могу получить с :

SELECT us.ID AS userID, us.Name, us.Surname, 
max(CASE WHEN ud.IDciselnik =1 THEN ud.skUserValue END) value_ID1, 
max(CASE WHEN ud.IDciselnik =3 THEN ud.skUserValue END) value_ID3
FROM user_data ud LEFT JOIN Users us ON us.ID = ud.IDuser 
WHERE us.Status=1 
GROUP BY us.ID ORDER BY value_ID3 DESC

Но у меня есть кнопка поиска, и я хочу фильтровать только пользователей из «Кошице» или похожего имени.
сначала мне нужно получить все ID из таблицы «ciselnik», где существует «Кошице»
и тогда идентификаторы из ‘ciselnik’ нужно проверить / сравнить, у какого пользователя они есть, и выбрать только тех пользователей, у которых skUserValue равен ‘ciselnik’

просто в моем выводе мне не нужно получать всех пользователей, но как в Примере вывода:

|userID | Name    | Surname | value_ID1          | value_ID3          | skTitle |
------------------------------------------------------------------
| 14    |  Joe    |   Smith | value1 text Joe    | value3 text Joe    | Kosice |
| 15    |  Paul   |  Taylor | value1 text Paul   | value3 text Paul   | Skošicel |

Я использовал это

SELECT us.ID AS userID, us.Name, us.Surname, c.skTitle,  
max(CASE WHEN ud.IDciselnik =1 THEN ud.skUserValue END) value_ID1, 
max(CASE WHEN ud.IDciselnik =3 THEN ud.skUserValue END) value_ID3
FROM user_data ud LEFT JOIN Users us ON us.ID = ud.IDuser 
LEFT JOIN ciselnik c ON c.ID = ud.skUserValue 
WHERE us.Status=1 
AND c.skTitle COLLATE utf8_general_ci LIKE '%kosice%' 
GROUP BY us.ID ORDER BY value_ID3 DESC

У меня теперь проблема, что в моих выходных данных это: value_ID1 и value_ID3 являются NULL
Спасибо за помощь

1 ответ

  1. Это было бы

    SELECT u.Name, u.Surname, d1.skUserValue AS value_ID1, d3.skUserValue AS value_ID3
    FROM Users u
    LEFT JOIN user_data d1 ON u.IDuser = u.ID AND d1.IDciselnik =1
    LEFT JOIN user_data d3 ON u.IDuser = u.ID AND d3.IDciselnik =3
    LEFT JOIN user_data d4 ON u.IDuser = u.ID AND d4.IDciselnik =4
    LEFT JOIN ciselnik c ON d4.skUserValue = c.ID
    WHERE c.skTitle LIKE '%blah%'
    

    Соединяя таблицу данных под разными псевдонимами, можно отфильтровать каждое подмножество по идентификатору в условии соединения.