遇到了一个业务上的问题,虽然可以直接写 SQL 查询语句解决,不过 SQL 语句是相当相当的长。 所以还是想问问有没有更优雅的处理方式
省略了部分无关字段
create_table "companies", force: :cascade do |t|
t.string "name", limit: 255
t.integer "status", limit: 4, default: 0
end
create_table "code_templates", force: :cascade do |t|
t.string "name", limit: 255
t.integer "status", limit: 4
t.integer "source", limit: 4
t.integer "company_id", limit: 4
end
create_table "template_items", force: :cascade do |t|
t.string "name", limit: 255
t.string "code", limit: 255
t.integer "status", limit: 4
t.integer "code_template_id", limit: 4
t.string "default_code", limit: 255
end
现在要查看一个公司里的信息,有多个模板。其中固定会有一个默认模板,source 为 0,其它每个模板各自有不同的 source。 每个模板各自有一些模板项,其中有部分项有相同的 default_code。
希望查看 模板 1(source 为 2) 的模板项数据。同时,需要增加一列 default_name,显示默认模板中与 default_code 对应的 name,如果没有对应项,default_name 就取 nil。
更容易理解一点的说法: 把模板 1 和默认模板分别看成两张表, 问题就是如何取得模板 1 的数据,加上默认模板与模板 1,在 default_code 数据上有交集的部分。
因为数据较多,还要分页,所以我感觉没法先把数据全部取出来再做匹配。想问问看有什么好的处理方式。
SELECT u1.code u1_code,u1.name u1_name ,u1.default_code u1_default_code ,u2.name u2_name
FROM ( SELECT t0.code,t0.name,t0.default_code FROM template_items t0
WHERE code_template_id IN (SELECT id FROM code_templates WHERE company_id = 1 AND source = 2 AND status=0)
) AS u1
LEFT JOIN
( SELECT t1.code,t1.name,t1.default_code FROM template_items t1
WHERE code_template_id IN ( SELECT id FROM code_templates WHERE company_id = 1 AND source = 0 AND status=0)
) AS u2
ON u1.default_code = u2.default_code limit 0,30;