2015-09-06 58 views
1

我在MySQL中有两个表。在MySQL中的两个表中的复杂查询

第一个表格是EMPLOYEES,它包含LASTNAME, NAME, MIDDLENAME, BIRHDATE和其他关于员工的列。

第二个表格是PROJECTS。它具有列STAFF。 工作人员有像 lastname1 name1, middlename1; lastname2 name2, middlename2.....

行我需要从雇员谁是在工作人员的人。

查询

SELECT LASTNAME, NAME, MIDDENAME from EMPLOYEES where 
CONCAT('%', LASTNAME, ' ', NAME, ' ',MIDDENAME, '%') 
like (SELECT STAFF FROM PROJECTS) 

不起作用,因为LIKE必须从第二查询

和查询一个子

SELECT LASTNAME, NAME, MIDDENAME from EMPLOYEES where 
CONCAT('%', LASTNAME, ' ', NAME, ' ',MIDDENAME, '%') 
IN (SELECT STAFF FROM PROJECTS) 

不会太大,因为工作需要完善的配套

有什么想法?

+0

请考虑格式化您的文章。 – Rahul

+1

提供您的表格定义和一些样本数据集来测试 –

+0

我会建议名称字符串(尽管它看起来像个好主意)对于实体相交来说是一个糟糕的主意 – Drew

回答

0

这就是当你在表中使用分隔字符串时,会发生这种情况,这是违反规范化的。首先考虑规范你的表。目前,您可以执行JOIN,大概如下所示,但如果STAFF列的数据格式完全相符,则不会发生匹配。

SELECT e.LASTNAME, e.NAME, e.MIDDENAME 
FROM EMPLOYEES e 
JOIN PROJECTS p 
ON CONCAT(e.LASTNAME, ' ', e.NAME, ' ', e.MIDDENAME) = p.STAFF; 

您可以如用FIND_IN_SET()功能类似下面却又首先考虑改变你的数据库设计和规范化表(S)

SELECT LASTNAME, 
      NAME, 
      MIDDENAME 
    FROM (
    SELECT LASTNAME, NAME, 
    MIDDENAME, 
    CONCAT(e.LASTNAME, ' ', e.NAME, ' ', e.MIDDENAME) as Full_Name 
    FROM EMPLOYEES) e 
    JOIN PROJECTS p 
    ON FIND_IN_SET(Full_Name, p.STAFF) > 0; 
+0

它只适用于员工包含一名员工。但STAFF中的很多行看起来像'lastname1,name1,middlename1; lastname2,name2,middlename2 ........ lastnameN,nameN,middlenameN' – Vitaly

+0

@Vitaly,这就是我说你的桌子设计不好,因为它现在。考虑首先对其进行标准化。如果有帮助,请参阅编辑答案。 – Rahul

+0

我做了一些改变(用LIKE和'%'):SELECT e.LASTNAME,e.NAME,e.MIDDENAME FROM EMPLOYEES e JOIN PROJECTS p ON p.STAFF LIKE CONCAT('%',e.LASTNAME,'' e.NAME,'',e.MIDDLENAME,'%');它运作良好!拉胡尔,非常感谢! – Vitaly