我有三张桌子。
结果表:
|result_id|client_id|....|inmylist (boolean)|
|rs_1 |cli_1 |....|null |
|rs_2 |cli_1 |....|null |
|rs_3 |cli_2 |....|null |
|rs_4 |cli_3 |....|null |
|rs_5 |cli_2 |....|null |
|rs_6 |cli_1 |....|null |
Mylist表:
|list_id|listname|list_description|
|1 |list one|first list desc |
|2 |list two|high performers |
|3 |list bla|lazy managers ..|
list_results表:
|list_id|result_id|
|1 |rs_1 |
|1 |rs_2 |
|2 |rs_1 |
|2 |rs_5 |
结果表中的inmylist列默认为null,其值将在select期间动态设置,具体取决于list_results表中是否存在结果。 即。
使用client_id = cli_1和list_id = 1选择所有结果应返回:
|result_id|client_id|....|inmylist (boolean)|
|rs_1 |cli_1 |....|true |
|rs_2 |cli_1 |....|true |
|rs_6 |cli_1 |....|false |
使用client_id = cli_2和list_id = 2选择所有结果应返回:
|result_id|client_id|....|inmylist (boolean)|
|rs_3 |cli_2 |....|false |
|rs_5 |cli_2 |....|true |
目前我通过执行第一个查询以编程方式执行,然后执行另一个查询以使用list_id获取列表中的所有项目,然后迭代上一个结果并更改inmylist的值。
我认为这不是一种非常有效的方法,如果有办法从查询中实现这一点并避免往返以及迭代。当表的大小增加时,性能开始受损。
所以请告诉我如何通过mysql查询来实现这个目的。
问候。
答案 0 :(得分:0)
你应该在你的SELECT语句中使用CASE WHEN(条件)THEN ... [ELSE] END CASE inline。
例如:
SELECT a.col1, a.col2, b.col1, CASE a.col1 == "X" THEN 'True!' ELSE 'Argh...' END CASE as DerivedColumn FROM a, b;
在上面的示例中,我使用CASE语句“计算”/派生一个列(在物理上不存在,没有选择的表中)。根据列COL1的值,从表a中,对于所选的每一行,该值设置为“True!”或“Argh”。
答案 1 :(得分:0)
应该可以使用以下内容:
UPDATE
result_table r
SET
r.inmylist =
(SELECT COUNT(*) FROM list_result l
WHERE r.result_id = l.result_id) > 0