我有一个表Record(id,name)。然后我在每个方法表中有10个不同的子表方法。
所以我的表格如下:
一:
Record (id, name)
1, abc
2, fgt
3, ght
二:
Method A (id, rec_id, meth_name)
1, 3, sub1_metha
2, 3, sub2_metha
3, 2, sub1_metha
4, 1, sub3_metha
....
三:
Method Z,(id, rec_id, meth_name)
1, 2, sub1_methz
2, 1, sub4_methz
3, 2, sub3_methz
4, 3, sub1_methz
用户需要能够sub_methods
使用AND
或ANY
操作数进行搜索。
我需要创建2个查询:
我觉得我在这里遗漏了一些非常明显的东西(UNION
,JOIN
,10 SELECT
s)?
答案 0 :(得分:1)
如果您在十个不同的表中确实有类似的信息,那么您的数据库设计有点弱。也许你应该只有一个用于sub_methods的表,并有一个额外的列来区分它们:
Method (id, rec_id, type, meth_name)
1, 3, A, sub1_metha
2, 3, A, sub2_metha
3, 2, A, sub1_metha
4, 1, A, sub3_metha
....
1, 2, Z, sub1_methz
2, 1, Z, sub4_methz
3, 2, Z, sub3_methz
4, 3, Z, sub1_methz
但是根据您的设计,您应该使用所有方法表的join
继续union
记录表。然后,您可以使用WHERE
或OR
在AND
中添加用户查询,具体取决于用户想要的模式:
SELECT * FROM record
INNER JOIN (
SELECT id, rec_id, 'A' as type, meth_name FROM Method_A
UNION
SELECT id, rec_id, 'Z' as type, meth_name FROM Method_Z
) methods on record.id = methods.rec_id
WHERE ...;
EDIT(使用数据库视图的替代解决方案):
正如Gudgip建议的那样:如果您已经拥有了表结构并且无法再进行更改,则可以创建VIEW
来简化上述查询(以及其他可能的查询)。为此,请执行以下语句:
CREATE VIEW all_methods AS
SELECT id, rec_id, 'A' as type, meth_name FROM Method_A
UNION
...
UNION
SELECT id, rec_id, 'Z' as type, meth_name FROM Method_Z;
结果你得到一个"别名"对于数据库级别的此构造,您的搜索查询可以写为
SELECT * FROM record
INNER JOIN all_methods on record.id = all_methods.rec_id
WHERE ...;