Mysql使用一对多关系连接

Mysql使用一对多关系连接,mysql,Mysql,主张 索赔身份 c_id claim id 1 201 2 202 3 203 4 204 如果已创建并提交索赔(如索赔编号202),则如果我使用“已创建”条件搜索,则不会显示该索赔。这是我的主要要求。我需要的结果如下所示 如果我使用status='created'搜索,我需要获得如下记录 cs_id claim_id status 1 201 created 2 202 created

主张

索赔身份

c_id   claim id   
1       201
2       202
3       203
4       204
如果已创建并提交索赔(如索赔编号202),则如果我使用“已创建”条件搜索,则不会显示该索赔。这是我的主要要求。我需要的结果如下所示 如果我使用status='created'搜索,我需要获得如下记录

cs_id   claim_id    status
1       201     created
2       202     created
3       202     submitted
4       203     submitted
5       204     created
c_id    claim_id    cs_id   claim_id    status
1           201     1           201     created
4           204     5           204     created
如果我使用status='submitted'搜索,我需要获得如下记录

cs_id   claim_id    status
1       201     created
2       202     created
3       202     submitted
4       203     submitted
5       204     created
c_id    claim_id    cs_id   claim_id    status
1           201     1           201     created
4           204     5           204     created
但我无法通过下面的查询获得结果。我是新来的。所以,请原谅我,如果我在明确张贴错误

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
对于“已提交的”:

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='created'  
GROUP BY cs.claim_id
对于“已提交的”:

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'

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

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

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

我知道这不是你要问的答案,但我认为最好有这样的答案:

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'
)

它更快、更干净、更好,一切(?)

另外,为了使它们更快,status应该是一个整数列,“created”应该有一个关联的数字,这样您就可以执行

SELECT * FROM claims WHERE status = 'submitted'
从状态=

提交状态或任何额外状态都是相同的

这些是您的实际表格吗?为什么您要在索赔以外的另一个表上处理索赔状态?你应该有一个关于“索赔”的“状态”栏,你就完成了。您可以有另一个用于版本控制的表(如果您想获得声明的旧状态)并保存更改、时间戳等,但是对于当前状态,最好将其放在同一个表上

我知道这不是你要问的答案,但我认为最好有这样的答案:

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'
)

它更快、更干净、更好,一切(?)

另外,为了使它们更快,status应该是一个整数列,“created”应该有一个关联的数字,这样您就可以执行

SELECT * FROM claims WHERE status = 'submitted'
从状态=

提交状态或任何额外状态也一样

…您的问题是?(仅供参考:您只需将此
cs.status='created'
一次:在
中的
中的
子句或
中的
中的
中,
子句)…您的问题是?(仅供参考:您只需将此
cs.status='created'
一次:在
ON
子句或
WHERE
子句中)谢谢您的回复。它工作正常,但对性能问题毫无疑问。在性能方面可以吗?如果两个表的claim_id上都有索引,那应该很好。有没有办法避免两次选择(查询内部查询)?我不知道你怎么做。谢谢你的回复。它工作正常,但对性能问题毫无疑问。在性能方面可以吗?如果两个表的claim_id上都有索引,那应该很好。有没有办法避免两次选择(查询内部查询)?我不知道怎么做。你能在claims上放一个“status”列吗?索赔状态表是毫无意义的。您在另一个表上重复索赔ID,并增加了查询的复杂性,如果您对该表没有特定的需求,我认为您应该在索赔表上添加status(状态)列您可以在索赔表上添加status(状态)列吗?索赔状态表是毫无意义的。您在另一个表上重复索赔ID,并增加了查询的复杂性,如果您对该表没有特定需求,我认为您应该使用索赔表上的状态