如果连接表

时间:2017-02-01 11:33:13

标签: mysql ruby-on-rails ruby-on-rails-4

以下是诊所有很多类别的表结构:

Clinic      Category

id          company_id | clinic_id | type
---         -----------------------------
1     ->    1          | 1         | pre
            2          | 1         | pre

2     ->    1          | 2         | ext
            2          | 2         | ext

3     ->    1          | 3         | pre

4     ->    2          | 4         | ext

5     ->    2          | 5         | pre

在这里,我想让输出中的所有诊所先按然后分机排序。但是,有时我会针对 company_id eg: 1, in the following try)检查一个条件,我不希望过滤掉诊所。

我的尝试

Clinic.joins("LEFT JOIN categories c ON c.clinic_id = clinics.id").
  order("
    CASE c.type
      WHEN 'pre' THEN 0
      WHEN 'ext' THEN 1
      ELSE 2
    END
  ").
  where("c.company_id = 1 OR c.company_id IS NULL")

问题是,从表格结构中可以看出,如果我没有与公司标识为1的类别匹配的诊所,它会被过滤掉,但是,我仍然希望该诊所能够是其他类型的输出的一部分。

公司ID的预期输出= 1

Clinic      Category

id          company_id | clinic_id | type
---         -----------------------------
1     ->    1          | 1         | pre

3     ->    1          | 3         | pre

2     ->    1          | 2         | ext

4     ->    NULL       | NULL      | NULL(or other)

5     ->    NULL       | NULL      | NULL(or other)

公司ID的预期输出= 2

Clinic      Category

id          company_id | clinic_id | type
---         -----------------------------
1     ->    2          | 1         | pre

5     ->    2          | 5         | pre

2     ->    2          | 2         | ext

4     ->    2          | 4         | ext

3     ->    NULL       | NULL      | NULL (or other)

1 个答案:

答案 0 :(得分:2)

left join本身,过滤下面的company_id

LEFT JOIN categories c ON c.clinic_id = clinics.id AND c.company_id = 1

希望这会帮助你。