2013-03-04 92 views
3

我在我的网站上使用sql server 2008 r2和php。 我有2张桌子。如何从另一个表中使用匹配的id来获取名称?

1适用于员工。

(int)  (nvarchar) (nvarchar) 

id   name  type 
1   john   2 
2   peter  1 
3   leah   2 
4   frank  1 
5   tang   3 

2是工作

(int)  (nvarchar) (nvarchar) 

workid  name  employees 
    1   task1  1,3 
    2   task2  2,3 
    3   task3  1,3,4 
    4   task4   2 

我想要查询这给我的工作描述,其中type < 3.

意味着我想造成这样的员工姓名。

workid  name  employee 
    1   task1  john, leah 
    2   task2  peter, leah 
    3   task3  john,leah,frank 

像明智

所以我怎样才能达到这个结果与SQL查询?

我无法更改表架构。

我试图用case语句,但它不工作。

请帮我得到这个工作..

+1

为什么不能更改表格模式?那真是太棒了!你将一个整数数组作为字符串存储。数据库不是为了进行这种搜索而设计的。所以你必须使用许多非常昂贵的操作才能使事情运行起来。您至少应该(!)将该列转换为“SET”。 ......。好多了:看看JW的帖子! – 2013-03-04 03:18:44

+0

假设你不能改变你的表格结构,看看我的文章 - 应该处理你的需求。如果你可以改变你的表格结构,看看JW的答案,因为它更适合于规范化。我只是不想假设你可以改变你的数据库结构。 – sgeddes 2013-03-04 03:50:38

回答

2

这样做的内容不能完全回答这个问题,但它会提示你如何能够正确地规范表,以便theproblem简化。

这是一个Many-to-Many的关系。

Employees 
- ID (Primary Key) 
- Name 
- Type 

Task 
- ID (Primary Key) 
- Name 

Work 
- EmployeeID (Foreign Key) 
- TaskID (Foreign Key) 

EMPLOYEE表

id   name  type 
1   john   2 
2   peter  1 
3   leah   2 
4   frank  1 
5   tang   3 

任务表

id   name   
    1   task1  
    2   task2  
    3   task3  
    4   task4 

工作台

TaskID EmployeeID 
1   1 
1   3 
2   2 
2   4 
3   1 
3   2 
3   3 
4   4 

查询,

SELECT t.ID, t.Name, 
     STUFF(
     (SELECT ',' + b.Name 
     FROM Work a 
       INNER JOIN Employee b 
        ON a.EmployeeID = b.ID 
     WHERE a.TaskID = t.ID 
     FOR XML PATH ('')) 
     , 1, 1, '') AS NamesList 
FROM Task t 
-- WHERE ..... -- add additional conditions... 
GROUP BY t.ID, t.Name 
+0

谢谢JW。我要求客户端改变模式并规格化表格。 – Mausami 2013-03-08 02:05:08

+0

不客气':D' – 2013-03-08 02:06:24

0

这里是可以拆分逗号分隔列表中的一个方式使用For XML:这导致

SELECT w.workid, w.name, 
    STUFF((
    SELECT ',' + E.Name AS [text()] 
    FROM (
     SELECT A.workid, 
     Split.a.value('.', 'VARCHAR(100)') AS EmpId 
     FROM 
     (SELECT workid, 
     CAST ('<M>' + REPLACE(employees, ',', '</M><M>') + '</M>' AS XML) AS String 
     FROM work 
    ) AS A 
     CROSS APPLY String.nodes ('/M') AS Split(a) 
    ) A 
    JOIN employees E ON A.EmpId = E.Id 
    WHERE WorkId = w.WorkId 
    FOR XML PATH('') 
), 1, 1, '') AS Employees 
FROM work w 

SQL Fiddle Demo

WORKID NAME EMPLOYEES 
1  task1 john,leah 
2  task2 peter,leah 
3  task3 john,leah,frank 
4  task4 peter 
+0

谢谢sgeddes。你的答案将起作用。但我要求客户端更改表格模式以使结构正常化,以便解决问题。再次感谢。 – Mausami 2013-03-08 02:04:29

相关问题