繁体   English   中英

SQL连接单个表的多行+通过另一个表过滤

[英]SQL Join with Multiple Rows of a Single Table + filter by another table

我想寻求帮助。

我的数据库中有这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|

表“ ciselnik”:

|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

但是,我有搜索按钮,我只想过滤来自“ kosice”或类似名称的用户。 首先,我需要从存在“ kosice”的表“ ciselnik”中获取所有ID,然后从“ ciselnik”中获取ID,我需要检查/比较哪个用户拥有它,并仅选择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谢谢您的帮助

那会是

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

通过以不同的别名联接数据表,您可以按联接条件中的ID过滤每个子集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM