【问题标题】:How do I perform this join query?如何执行此连接查询?
【发布时间】:2016-04-01 06:46:49
【问题描述】:

我有一张桌子leave_form,看起来像:

type     id reporting_id leave_bal from_date_id leave_from to_date_id leave_to number leave_for status applied_dates_id pendays
personal 99 6            10        1023         full day   1313       full day 10     personal  yes    1026             null

我有单独的日期表,以便我可以将这些日期引用到leave_form。我的leave_date 表看起来像:

date_id(AI)  dates(UK)
1025        2016-02-18
1301        2016-02-20
1218        2016-02-16

这个date_id 我已经插入到leave_form 表中的from_date_id, to_date_id, applied_dates_id 列中,即所有日期都插入到leave_date 表中,从这个表中我只是将date_id 引用到leave_form 表中。

还有一个表格保存emp_codeemp_name。我的personal 表是:

id(AI)  emp_code(PK)   emp_name
99        K0209         Nijo 

当我尝试从 leave_form 表中获取 from_date_id, to_date_id, applied_dates_id 列的日期时,我没有得到任何值。

我获取日期的查询是:

select g.type, a.emp_code, h.rm_id, h.rm_name, g.leave_bal, i1.dates as from_date,
    g.leave_from, i2.dates as to_date, g.leave_to, g.number, g.leave_for, g.status,
    i3.dates as applied_date, g.pendays
  from personal a
  inner join leave_form g
    on a.id = g.id
  inner join inform_to_rm h
    on h.reporting_id = g.reporting_id
  inner join leave_dates i1
    on i1.dates = g.from_date_id
  inner join leave_dates i2
    on i2.dates = g.to_date_id
  inner join leave_dates i3
    on i3.dates = g.applied_dates_id
  where a.emp_code = 'K0209';

它显示的结果如下:

type, emp_code, rm_id, rm_name, leave_bal, from_date, leave_from, to_date, leave_to, number, leave_for, status, applied_date, pendays

即当我执行此查询时没有返回数据。

【问题讨论】:

  • 您将尝试像“Left join leave_form g”一样左加入。因为内连接仅在两个表具有匹配值时才返回结果,否则它什么都没有返回任何东西
  • 一个附带问题:为什么要使用这个 date_id 构造而不是简单地将日期放在 leave_form 表中?
  • 我已经完成了左连接,但它没有返回 from_date、to_date、applied_date 的日期。我希望通过将 date_id 与 leave_dates 表和 leave_form 表进行比较来返回日期。
  • 真的是每个员工只能有一个leave_form吗?

标签: mysql inner-join


【解决方案1】:

我同意该问题的其中一位 cmets。我建议直接在 leave_form 表中引用日期,而不是在带有日期的表中引用 FK。但回到问题。您还没有完全描述您的所有表格,因此可能有多个我看不到的问题,但是,肯定有一个问题。

您的查询加入

inner join leave_dates i1
  on i1.dates = g.from_date_id
inner join leave_dates i2
  on i2.dates = g.to_date_id
inner join leave_dates i3
  on i3.dates = g.applied_dates_id

这是不正确的。 leave_dates.dates 是实际日期,而您要加入的列(leave_form.from_date_id、leave_form.to_date_id、leave_form.applied_dates_id)是外键引用。

例如,1023 不等于 2016-02-18,因此您找不到匹配项。将上面的 query-sn-p 替换为以下内容将解决这个特定问题。

inner join leave_dates i1
  on i1.date_id = g.from_date_id
inner join leave_dates i2
  on i2.date_id = g.to_date_id
inner join leave_dates i3
  on i3.date_id = g.applied_dates_id

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2021-10-11
    • 1970-01-01
    • 2018-09-23
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多