查找多个表中存在的记录

时间:2014-05-20 14:34:14

标签: php mysql join multiple-tables

我有一个表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使用ANDANY操作数进行搜索。

我需要创建2个查询:

  1. 选择包含用户指定的所有子方法的所有记录。
  2. 选择具有用户指定的任何子方法的所有记录。
  3. 我觉得我在这里遗漏了一些非常明显的东西(UNIONJOIN,10 SELECT s)?

1 个答案:

答案 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记录表。然后,您可以使用WHEREORAND中添加用户查询,具体取决于用户想要的模式:

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 ...;