mysql - 具有可能的条件匹配的多表连接

标签 mysql

我在用 PHP 创建的应用程序中组合了几个表,该应用程序实质上创建了一个核对表。我意识到我可以在 PHP 中使用条件来解决这个问题,但我很好奇 MySQL 是否能够完成这个任务,如果可以,如何实现?具体来说,我有四个表,使用以下语句查询:

SELECT 
cl_status.status, 
users.user_first, 
cl_status.date AS status_date, 
cl_status.id AS status_id, 
cl_status.criteria_id,
cl_criteria.id AS cid, 
cl_criteria.description AS description 

FROM cl_criteria 
LEFT JOIN cl_lists 
  ON cl_criteria.cl_id = cl_lists.id 
RIGHT JOIN cl_status 
  ON cl_criteria.id = cl_status.criteria_id 
LEFT JOIN users 
  ON cl_status.user_id = users.user_id 
WHERE cl_lists.id = '1'

Table one - cl_lists:
+----+------------------+------------+------------+-------+
| id | title            | date       | comp_level | owner |
+----+------------------+------------+------------+-------+
|  1 | Newcomer's guide | 1452473606 |          1 |     1 |
+----+------------------+------------+------------+-------+

 Table two - cl_assign:
+----+-------+-------+------------+
| id | cl_id | owner | date       |
+----+-------+-------+------------+
|  1 |     1 |     1 | 1455843514 |
+----+-------+-------+------------+

Table three - cl_status:
+----+-------------+---------+-------------+------------+--------+----------+
| id | criteria_id | user_id | description | date       | status | comments |
+----+-------------+---------+-------------+------------+--------+----------+
|  2 |          66 |       1 |             |       NULL |      1 | NULL     |
| 15 |          65 |       1 |             | 1455842197 |      5 | NULL     |
| 16 |          67 |       1 |             | 1455842201 |      5 | NULL     |
| 17 |          68 |       1 |             | 1455842203 |      5 | NULL     |
| 18 |          69 |       1 |             | 1455842217 |      0 | NULL     |
| 19 |          70 |       1 |             | 1455842222 |      5 | NULL     |
| 20 |          72 |       1 |             | 1455842237 |      1 | NULL     |
| 21 |          71 |       1 |             | 1455842234 |      0 | NULL     |
| 22 |          73 |       1 |             | 1455842246 |      5 | NULL     |
| 23 |          76 |       1 |             | 1455842249 |      5 | NULL     |
| 24 |          77 |       1 |             | 1455842268 |      5 | NULL     |
| 25 |          78 |     152 |             | 1455854420 |      3 | NULL     |
| 26 |          81 |       1 |             | 1455843660 |      5 | NULL     |
+----+-------------+---------+-------------+------------+--------+----------+

Table four - users:
+---------+------------+
| user_id | user_first |
+---------+------------+
|       1 | Mark       |
|       2 | Test       |
+---------+------------+

理想情况下,我希望连接看起来像这样:

+--------+------------+-------------+-----------+-------------+------+-----------------------------+
| status | user_first | status_date | status_id | criteria_id | cid  | description                 |
+--------+------------+-------------+-----------+-------------+------+-----------------------------+
|      5 | Mark       |  1455842197 |        15 |          65 |   65 | Tour of facility            |
|      5 | Mark       |  1455842201 |        16 |          67 |   67 | Tax forms                   |
|      5 | Mark       |  1455842203 |        17 |          68 |   68 | 2 forms of ID               |
|      0 | Mark       |  1455842217 |        18 |          69 |   69 | Benefits                    |   |
|      5 | Mark       |  1455842246 |        22 |          73 |   73 | Intro to policies           |
|      5 | Mark       |  1455842249 |        23 |          76 |   76 | Setup email account         |
|   NULL | NULL       |  NULL       |      NULL |          78 |   78 | Setup Computer account      |
+--------+------------+-------------+-----------+-------------+------+-----------------------------+

但是,它看起来像这样:

+--------+------------+-------------+-----------+-------------+------+-----------------------------+
| status | user_first | status_date | status_id | criteria_id | cid  | description                 |
+--------+------------+-------------+-----------+-------------+------+-----------------------------+
|      5 | Mark       |  1455842197 |        15 |          65 |   65 | Tour of facility            |
|      5 | Mark       |  1455842201 |        16 |          67 |   67 | Tax forms                   |
|      5 | Mark       |  1455842203 |        17 |          68 |   68 | 2 forms of ID               |
|      0 | Mark       |  1455842217 |        18 |          69 |   69 | Benefits                    |
|      5 | Mark       |  1455842246 |        22 |          73 |   73 | Intro to policies           |
|      5 | Mark       |  1455842249 |        23 |          76 |   76 | Setup email account         |
|      3 | Temp       |  1455854420 |        25 |          78 |   78 | Setup Computer account      |
+--------+------------+-------------+-----------+-------------+------+-----------------------------+

有没有办法在连接之前应用条件?还是另一种方式来完成我想要的结果集?

编辑 这是应用程序的屏幕截图: Application Screenshot

标准表将包括我拥有的每个 list 的步骤。列表是各种 list 的列表。状态表允许每个用户(例如标记或测试)查看相同的 list 并完成它,就好像它是一个单独的文档一样。它还会填充该用户更新项目的日期/时间。

最佳答案

我怀疑您在查询中使用的 RIGHT JOIN 导致您希望显示的记录被过滤掉。请记住 t1 RIGHT JOIN t2t2 LEFT JOIN t1 相同,这意味着 t1 将丢失未出现在 中的任何记录>t2t2 保留所有记录。试试这个:

SELECT cl_status.status, users.user_first, cl_status.date AS status_date,
       cl_status.id AS status_id, cl_status.criteria_id, cl_criteria.id AS cid,
       cl_criteria.description AS description 
FROM cl_criteria LEFT JOIN cl_lists 
    ON cl_criteria.cl_id = cl_lists.id 
LEFT JOIN cl_status 
    ON cl_criteria.id = cl_status.criteria_id 
LEFT JOIN users 
    ON cl_status.user_id = users.user_id 
WHERE cl_lists.id = '1'

关于mysql - 具有可能的条件匹配的多表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35497463/

相关文章:

mysql - MySQL查询执行计划的限制因地点而异

mysql - t2.micro EC2 实例运行太慢一段时间后恢复正常

mysql - 识别模式是否在文本字段中重复出现的 SQL 查询

php - 基于用户的子域

php - 逐个键查找两行数据之间的差异

PHP - 使用登录系统保护仅限成员(member)的页面

php - 使用 PHP 数组根据日期范围和类型填充价格字段

MySQL 插入但更新/忽略重复

javascript - 如何在不相关的组件之间共享数据? Angular 6

php - 插入数据库中具有两位小数的千位数的格式