我正在使用以下语句尝试正确收集和显示数据。有必要使用一个表来“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)
答案 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提供的代码