如何在select期间使用另一个表中的列的值设置表列值

时间:2014-11-30 15:19:22

标签: java mysql

我有三张桌子。

结果表:

|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查询来实现这个目的。

问候。

2 个答案:

答案 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