Mysql加入一对多关系

时间:2013-11-29 13:18:37

标签: mysql

权利要求书

c_id   claim id   
1       201
2       202
3       203
4       204

claim_status

cs_id   claim_id    status
1       201     created
2       202     created
3       202     submitted
4       203     submitted
5       204     created

如果声明已创建并提交(如claim_id 202),则在我使用“已创建”条件进行搜索时,它不会显示。这是我的主要要求。我需要下面的结果 如果我使用status ='created'搜索,我需要获得如下记录

c_id    claim_id    cs_id   claim_id    status
1           201     1           201     created
4           204     5           204     created

如果我使用status ='submitted'进行搜索,我需要获取以下记录

c_id    claim_id    cs_id   claim_id    status
2           202     3           202     submitted
3           203     4           203     submitted

但是我无法通过以下查询获得我的结果。我是stackoverflow的新手。如果我在明确的帖子中出错了,请原谅我。

SQL:

SELECT * from claims c 
INNER JOIN claim_status cs 
ON c.claim_id = cs.claim_id 
WHERE cs.status='created'  
GROUP BY cs.claim_id

3 个答案:

答案 0 :(得分:1)

代表'created':

SELECT * from claims c 
INNER JOIN claim_status cs 
ON c.claim_id = cs.claim_id  
WHERE cs.status='created'

表示“已提交”:

SELECT * from claims c 
INNER JOIN claim_status cs 
ON c.claim_id = cs.claim_id  
WHERE cs.status='submitted'

答案 1 :(得分:0)

要获取已创建但未提交的声明,请尝试以下操作:

SELECT * from claims c 
INNER JOIN claim_status cs 
ON c.claim_id = cs.claim_id
WHERE cs.status='created'  
AND NOT EXISTS (
  SELECT 1
  FROM claim_status cs2
  WHERE cs2.claim_id = cs.claim_id
        AND cs2.status='submitted'
)

答案 2 :(得分:0)

那些是你真正的桌子吗?为什么你在另一张桌子上处理索赔状态而不是索赔?你应该在“索赔”上有一个“状态”栏,你就完成了。你可以有另一个用于版本控制的表(如果你想获得索赔的旧状态)并保存更改,时间戳等,但是对于当前状态来说,将它放在同一个表上要好得多

我知道这不是你要问的答案,但我觉得最好有这样的话:

SELECT * FROM claims WHERE status = 'created'

SELECT * FROM claims WHERE status = 'submitted'

它更快,更清洁,更好,一切(?)

另外,为了使它们更快,状态应该是一个整数列,“created”应该有一个相关的数字,所以你可以做

SELECT * FROM claims WHERE status = <value that means created>

提交或任何额外状态相同