两个表的SQL不同查询

时间:2010-10-12 17:35:20

标签: sql mysql

表1:

id  -  name  -  address
-----------------------------
1   -  Jim   -  Some Street    
2   -  Adam  -  Some Street    
3   -  ABC   -  Some Street

表2:

id  -  job  -  finished_by
---------------------------
1   -  ABC  -  2    
2   -  EFD  -  3    
3   -  XYZ  -  2    
4   -  BVC  -  1

在上面的两个表中,Table1.id和Table2.finished_by应该被链接。

例如,在表2中,工作ABC由亚当完成。

我的目标是从表2中选择DISTINCT条记录。

结果应该输出每个人完成的所有工作。

到目前为止我有这个问题:

   SELECT *
     FROM table2
LEFT JOIN table1 ON table2.finished_by = table1.id
     LIMIT 0 , 30

这会并排加入Tables,但是如何编辑查询以使其仅显示不同的记录,以便输出为:

id  -  job  -  id  -  name
----------------------------
1   -  ABC  -  2  -  Adam    
2   -  EFD  -  3  -  ABC    
4   -  BVC  -  1  -  Jim

更新

所以,我做了一些谷歌搜索并对我的查询进行了一些更改:

SELECT DISTINCT finished_by FROM table2     LEFT JOIN table1 ON table2.finished_by = table1.id          限制0,30

但是,似乎只执行查询的第一行,因为我没有看到LEFT JOIN表。

可能这个查询需要多一点整理??

更多更新:

所以,从StacKOverflow的一些非常杰出的成员那里我已经注意到我的逻辑是完全错误的。所以,我将尝试用简单的单词而不是程序/代码来解释我想要实现的目标。可能就是这样,我可以快速找到解决方案。

所以,我的公司是:CompanyA 吉姆,亚当等人都为公司A工作..但是,公司A派吉姆,亚当等为另一家公司工作..说公司1

吉姆,亚当等可以被派去为多家这样的公司工作。说吉姆被派去为Company1工作两次,亚当被派去为公司1工作三次。

表2按以下格式记录了一个人为Company1工作的时间:

表2 :(参考:公司1)

id  -  job  -  finished_by  -  Date  
------------------------------------
1   -  ABC  -  2    -  10 Oct
2   -  EFD  -  3    -  11 Oct
3   -  XYZ  -  2    -  12 Oct 
4   -  BVC  -  1    -  13 Oct

现在,我的目标很简单,需要按照以下方式为Company1生成报告:

  • 列出我们发送给Company1的人员(按字母顺序排列)
  • 此列表应包括此人去过的次数(和日期)
  • 还应包括他在Company1工作时所做的工作

例如,理想输出/报告将是:

员工姓名 - 职位描述 - 日期

ABC - EFD - 10月11日

Adam - ABC,XYZ - 10月10日,10月12日

Jim - BVC - 10月13日

我可以做所有的基本报告,但我不知道如何将在finished_by coloumn中坐在Table2中的数字转换为table1中各自的名称

我希望我现在明白我的问题。

谢谢,每个人!!

我非常感谢您的时间和精力

3 个答案:

答案 0 :(得分:2)

根据您的最新更新,您似乎想要一个逗号分隔的“作业”名称和日期列表。 MySQL的GROUP_CONCAT函数实现了这一点。所以也许是这样的:

SELECT table1.*, GROUP_CONCAT(table2.job), GROUP_CONCAT(table2.date)
FROM table1
INNER JOIN table2 ON (t1.id = t2.finished_by)
GROUP BY t1.id

这将为您提供所有工作人员的清单,以及他们工作地点和时间的逗号分隔清单。

请注意,每个GROUP_CONCAT列表中的值都没有顺序。因此,您无法确定,例如,列出的第一个作业是否与列出的第一个日期相对应。但是如果你想保持这种连接不变,那么无论如何你都希望每个工作分开。

答案 1 :(得分:1)

SELECT DISTINCT *
FROM table2
LEFT JOIN table1 ON table2.finished_by = table1.id
LIMIT 0 , 30

这有用吗?

答案 2 :(得分:0)

听起来好像你想要所有的Table1细节,以及他们从Table2完成的所有工作的计数。如果是这样,试试这个:

select t1.id, 
       max(t1.name)    name, 
       max(t1.address) address, 
       count(t2.id)    finished_jobs
from Table1 t1 left outer join Table2 t2 on t1.id = t2.finished_by
group by t1.id;