如何联接相互依赖的表

时间:2019-07-12 13:24:28

标签: mysql database-design rdbms

假设我正在建立图书借阅数据库。

   Product product = repository.getProduct(id)
   ProductBuilder.Builder builder = new ProductBuilder.Builder()

   if(product ==  null){
     builder.location("abc").quantity(5).price(10)
     if(parmas.getAvaiability() != null){
          builder.availability(parmas.getAvaiability())
     }

   } else {
      builder.withProduct(product)
             .availability(params.getAvailability())
   }

我希望我的查询列出具有当前贷方名称的所有图书,但是如果没有人借出该图书,它仍应使用名称字段NULL列出该图书。

此查询两次列出ID为(2)的书。但是我希望它仅显示当前贷方的名称一次。

我尝试使用内部联接,右联接,但无法实现。我想念什么?

我以前在lend_history中有“ is_current”列,但在阅读Could I make a column in a table only allows one 'true' value and all other rows should be 'false'之后,我决定创建一个单独的表以进行更好的实践。

1 个答案:

答案 0 :(得分:3)

由于对“ is_current”列的处理,因此三个表之间不能具有直接联接。一种方法是使用Derived Tables(子查询);在子查询中,您可以获取所有“当前”的借出历史记录项。现在,简单地handleInputChange(e: React.ChangeEvent<HTMLInputElement>) { this.setState({ [e.target.name]: e.target.value }); } 子查询结果到books表:

Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'IState | ((prevState: Readonly<IState>, props: Readonly<{}>) => IState | Pick<IState, "email" | "password" | "errors"> | null) | Pick<IState, "email" | "password" | "errors"> | null'.
  Type '{ [x: string]: string; }' is missing the following properties from type 'Pick<IState, "email" | "password" | "errors">': email, password, errorsts(2345)

View on DB Fiddle

结果

LEFT JOIN

边注::我宁愿坚持使用原来的架构,即拥有两个表SELECT b.id, dt.lender_name FROM books AS b LEFT JOIN ( SELECT lh.book_id, lh.lender_name FROM lend_current AS lc JOIN lend_history AS lh ON lh.id = lc.lend_history_id ) AS dt ON dt.book_id = b.id 和{{1,而不是创建第三个表| id | lender_name | | --- | ----------- | | 1 | | | 2 | ola | }}。现在要确定哪个历史记录行是当前的,我们可以有两种方法:

  1. 您的原始方法:lend_history表中有lend_current字段(如果当前行,则为1。
  2. 或者,我们可以在books表中有一个lend_history字段,用于存储当前历史记录行的is_current。如果当前未借出该书,则为current_history_id。这也可以利用外键约束。