整理两个表中的数据

时间:2014-08-17 23:46:20

标签: mysql sql

我正在使用以下语句尝试正确收集和显示数据。有必要使用一个表来“LEFT JOIN”来收集更多信息,但我应该说第二种情况没有必要这样做(但这是我的解决办法)。

SELECT
    COALESCE(building.campus_id, campus.campus_id) AS campus 
    member.*
FROM location
LEFT JOIN cu_member AS member ON
    (member.member_id = location.member_id)
LEFT JOIN cu_building AS building ON
    (location.params LIKE 'building_id=%' = building.id) 
LEFT JOIN cu_campus AS campus ON
    (location.params LIKE 'campus_id=%' = campus.id)

我是我的上述查询,我​​想使用通配符值。

LEFT JOIN cu_building AS building ON
    ('39' = building.id) 

以下是我的location表的外观。我正在尝试使用params列中的数据从另一个表(campus)中获取结果building。我只需要对包含building_id标记的字段执行此操作,而不是对于那些使用'campus_id`的字段执行此操作,因为这已经是已知的。

-----------------------------
 member_id  | params  
-----------------------------
 1          | building_id=39
 2          | building_id=24
 3          | campus_id=6
 4          | campus_id=3
 5          | building_id=11
 6          | campus_id=14
 7          | building_id=15

这就是我building表的外观。它列出了哪个建筑物属于哪个校园。

--------------------------
 building_id  | campus_id 
--------------------------
 39           | 5
 24           | 4
 11           | 2
 15           | 2

我有另一张名为“校园”的桌子。我的问题是,这个表只列出,但我希望使用这个表,以便在最终结果中显示正确的数据。

--------------------------
 campus_id   | name 
--------------------------
 6           | ...
 3           | ..
 14          | .

我想用MySQL查询实现的结果是这样的。这里,收集的结果显示在一个表中。

-----------------------------
 member_id  | campus  
-----------------------------
 1          | 5                      (building_id=39)
 2          | 4                      (building_id=24)
 3          | 6                      (campus_id=6)
 4          | 3                      (campus_id=3)
 5          | 2                      (building_id=11)
 6          | 14                     (campus_id=14)
 7          | 2                      (building_id=15)

2 个答案:

答案 0 :(得分:2)

首先要做的事情。 您确实需要修改数据库结构。该位置表将为您提供无数的问题,使您在建筑物和校园中加入成员所需的每个查询都变得复杂。根据显示的数据,您确实应该在成员表上拥有building_id和campus_id。另一个更软的解决方案是在位置表中有一个building_id和一个campus_id列。

也就是说,你不需要正则表达式,也不需要LIKE来使这个查询工作。像这样的东西应该适当地工作:

SELECT
  COALESCE(b.campus_id, c.id) AS campus 
  m.*
FROM      cu_member   m
JOIN      location    l ON l.member_id = m.member_id
LEFT JOIN cu_building b ON l.params = CONCAT('building_id=',b.id)
LEFT JOIN cu_campus   c ON l.params = CONCAT('campus_id=',c.id)

我可以看到最后一次加入似乎有点多余,因为你真的只需要校园ID,而不是名字或其他信息。这已经存在于位置表中,因此加入校园表似乎没有必要。问题是它嵌入在params列中。提取它是一团糟。

答案 1 :(得分:0)

在您提供的示例中,最好将params列扩展为building_id和campus_id列。

加入这一点变得非常容易。

SELECT
    COALESCE(building.campus_id, campus.campus_id) AS campus 
    member.*
FROM location
LEFT JOIN cu_member AS member ON     (member.member_id = location.member_id)
LEFT JOIN cu_building AS building ON (location.building_id = building.building_id) 
LEFT JOIN cu_campus AS campus ON     (location.campus_id = campus.campus_id)

如果此处有其他原因导致难以创建单独的列,请使用@Frazz提供的代码