【问题标题】:How to join two tables on mysql or php with multiple condition如何在具有多个条件的mysql或php上连接两个表
【发布时间】:2021-10-06 17:32:50
【问题描述】:

表 1:项目列表

id name
5 A
6 B
7 C
8 D
9 E

表 2:用户生产力

id project_id task_id comment date_created
1 5 1 p5.task1 2021-09-28 13:40:19
2 6 1 p6.task1 2021-09-28 13:41:19
3 7 1 p7.task1 2021-09-28 13:42:19
4 8 1 p8.task1 2021-09-28 13:43:19
5 5 2 p5.task2 2021-09-28 13:44:19
6 6 2 p6.task2 2021-09-28 13:45:19
7 7 2 p7.task2 2021-09-28 13:46:19
8 8 2 p8.task2 2021-09-28 13:47:19

表 3:任务列表

id project_id
1 5
2 6
3 7
4 8
5 9

我的问题是如何连接两个表并显示查询列 'comment' 只是列 'date_created' 的最后一次更新或 DESCENDING。 请帮助解决我在这种情况下的问题。非常感谢您提前。干杯!

SELECT project_list.id, project_list.name, user_productivity.project_id, 
        user_productivity.comment, user_productivity.date_created 
FROM project_list 
    LEFT JOIN user_productivity ON project_list.id = user_productivity.project_id 
GROUP BY project_list.id
No id (on table project_list) name comment date_created
1 5 A p5.task1 2021-09-28 13:40:19
2 6 B p6.task1 2021-09-28 13:41:19
3 7 C p7.task1 2021-09-28 13:42:19
4 8 D p8.task1 2021-09-28 13:43:19
5 9 E

结果是:组 id 已解决。但评论不是最后更新的日期_created

我也试试:

SELECT project_list.id, project_list.name, user_productivity.project_id, 
        user_productivity.comment, user_productivity.date_created 
FROM project_list 
    LEFT JOIN user_productivity ON project_list.id = user_productivity.project_id 
ORDER BY unix_timestamp(user_productivity.date_created) desc
No id (on table project_list) name comment date_created
1 5 A p5.task2 2021-09-28 13:44:19
2 6 B p6.task2 2021-09-28 13:45:19
3 7 C p7.task2 2021-09-28 13:46:19
4 8 D p8.task2 2021-09-28 13:47:19
5 5 A p8.task1 2021-09-28 13:43:19
6 6 B p7.task1 2021-09-28 13:42:19
7 7 C p6.task1 2021-09-28 13:41:19
8 8 D p5.task1 2021-09-28 13:40:19
9 9 E

结果是“评论”已解决,但组 ID 显示所有查询

我想要的结果:

No id (on table project_list) name comment date_created
1 5 A p5.task2 2021-09-28 13:44:19
2 6 B p6.task2 2021-09-28 13:45:19
3 7 C p7.task2 2021-09-28 13:46:19
4 8 D p8.task2 2021-09-28 13:47:19
5 9 E

【问题讨论】:

  • 您希望使用左连接而不是内连接来保留 project_list 中在 project_list 中没有匹配记录的记录。
  • 好的,很好。左连接解决了。
  • 如何在该条件下显示“评论”?我希望 'comment' 仅按 'date_created' 的顺序显示
  • SELECT project_list.id, project_list.name, user_productivity.project_id, user_productivity.comment, user_productivity.date_created FROM project_list INNER JOIN user_productivity ON project_list.id = user_productivity.project_id GROUP BY project_list.id
  • 请通过编辑为您的问题添加所有说明

标签: mysql


【解决方案1】:

如果没有更多的输入,这个问题实际上是无法解决的,想象一下你的输入表会是 user_productivity 表的样子

id project_id task_id comment date_created
1 5 1 p5.task1 2021-09-28 13:40:19
2 5 2 p6.task2 2021-09-28 13:40:19
3 5 3 p6.task3 2021-09-28 13:38:19

那么对于 project_id 5,哪个是对应评论的最后更新日期? 您需要在 project_id 和 date_created 上定义一个唯一约束,这样您就不能在一个项目上拥有两个具有相同 date_created 的 cmets,或者您需要说,例如我总是想使用最后插入的 date_created 和评论,并且 ID 是自动递增的。

您需要加入仅包含 project_id 和最后更新日期的数据表示,而不是加入您的 user_productivity 表

你会得到这个

SELECT project_id, MAX(date_created) as date_created FROM user_productivity GROUP BY project_id

这会导致 |项目 ID |日期创建 | |------------|--------------| |5| 2021-09-28 13:44:19 | |6| 2021-09-28 13:45:19 | |7| 2021-09-28 13:46:19 | |8| 2021-09-28 13:47:19|

但在这种情况下,您缺少 user_productivity 组中的评论列,而您可以在 project_id 和 date_created 上再次加入 user_productivity,如果您有例如对 project_id 和 date_created 的唯一约束我会这样做,但如果不是,您可以有多个与 project_id 和 date_created 匹配的行。

如果你知道,例如user_productivity 中最大的 ID 总是最新的,因为例如自动增量你也可以先加入

SELECT MAX(ID) as ID, project_id FROM user_productivity GROUP BY project_id

这会导致

ID project_id
5 5
6 6
7 7
8 8

您现在可以根据 ID 再次加入 user_productivity 并获取您需要的所有列。

SELECT project_list.id, project_list.name, user_productivity.project_id, 
    user_productivity.comment, user_productivity.date_created 
FROM project_list
LEFT JOIN (SELECT MAX(ID) as ID, project_id FROM user_productivity GROUP BY project_id) helper 
    ON helper.project_id = project_list.id
LEFT JOIN user_productivity ON user_productivity.id = helper.id 
GROUP BY project_list.id

【讨论】:

    【解决方案2】:

    太棒了!非常感谢您的帮助。 是的。需要另一个表来加入所有连接。我从表 task_list 中输入 id,其中 user_productivity 表上的 task_id 是表 task_list 上的 id(见表 3:task_list 我对我的问题的澄清)

    SELECT project_list.id, project_list.name, user_productivity.project_id, user_productivity.comment, user_productivity.date_created, project_list.claim_no, project_list.claim_status, project_list.assigned_user
    FROM project_list 
    LEFT JOIN (SELECT MAX(ID) as ID, project_id FROM user_productivity GROUP BY project_id) task_list ON task_list.project_id = project_list.id 
    LEFT JOIN user_productivity ON user_productivity.id = task_list.id GROUP BY project_list.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      相关资源
      最近更新 更多