从表中获取搜索结果并引用表

时间:2009-06-29 06:09:18

标签: php mysql search

(使用MySQL和PHP)

我有一个搜索表单,允许我的用户输入字符串,并根据特定条件搜索该字符串。

我的问题是用户需要能够搜索跨多个表“传播”的信息。例如:

-Table“users”包含fname,lname,role,username(PK)

-Table“常驻助手”包含用户名(FK到用户),建筑物,房间,区域

-Table“area coordinator”包含用户名(FK到用户),office_bldg,office_num

我允许我的用户按名字,姓氏,建筑,地区,办公室#进行搜索 - 所以我需要显示跨越多个表的结果(即匹配来自“用户”和“常驻助手”的记录)

我一直在试验联盟和联盟,但还没有得到任何有用的东西。我正在寻找最“通用”的SQL语句来处理任何搜索,如果可能的话。

现在,我能想到进行这些搜索的唯一方法是通过PHP中的大量处理,例如,查找名字,查询返回用户名,角色来自“用户”,然后有一堆if语句说,“如果是这个角色,那么搜索这个表,其中username等于......”

有更好的方法吗?


Vinko -

我实际上没有收到错误,查询(带有多个连接)只返回0行。

以下是我正在使用的示例查询:

select u.fname, u.lname, u.role, u.username, r.building, r.room, r.region, 
a.office, a.office_num
from 
users u 
join `ra_ca` r on (u.username = r.username) 
join `area_coord` a  on (u.username = a.username)
where
u.username = 'behrk2' and r.region = '4'

这是我的桌面结构:

CREATE TABLE `users` (
 `fname` varchar(50) NOT NULL,
 `lname` varchar(50) NOT NULL,
 `role` varchar(75) NOT NULL,
 `extension` int(4) default '6226',
 `username` varchar(25) NOT NULL,
 `password` varchar(75) NOT NULL,
 `new_pass` varchar(5) default NULL,
 PRIMARY KEY  (`username`),
 KEY `role` (`role`),
 CONSTRAINT `users_ibfk_1` FOREIGN KEY (`role`) REFERENCES `role` (`role`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `ra_ca` (
 `username` varchar(25) NOT NULL,
 `region` tinyint(4) NOT NULL,
 `building` varchar(75) NOT NULL,
 `room` varchar(10) NOT NULL,
 PRIMARY KEY  (`username`),
 KEY `region` (`region`),
 KEY `building` (`building`),
 CONSTRAINT `ra_ca_ibfk_9` FOREIGN KEY (`building`) REFERENCES `building` (`building`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `ra_ca_ibfk_7` FOREIGN KEY (`username`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `ra_ca_ibfk_8` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `area_coord` (
 `username` varchar(25) NOT NULL,
 `region` tinyint(4) NOT NULL,
 `building` varchar(75) NOT NULL,
 `room` varchar(10) NOT NULL,
 `office` varchar(75) NOT NULL,
 `office_num` varchar(10) NOT NULL,
 PRIMARY KEY  (`username`),
 KEY `region` (`region`),
 KEY `building` (`building`),
 CONSTRAINT `area_coord_ibfk_9` FOREIGN KEY (`building`) REFERENCES `building` (`building`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `area_coord_ibfk_7` FOREIGN KEY (`username`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `area_coord_ibfk_8` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我在数据库中确实有值......

1 个答案:

答案 0 :(得分:2)

通过以下内容,您只需要在where子句中构建代码。这是查询的最后一行。

select u.fname, u.lname, u.role, u.username, r.building, r.room, r.region, 
a.office_bldg, a.office_num
from 
users u 
join `resident assistant` r on (u.username = r.username) 
join `area coordinator` a  on (u.username = a.username)
where
u.username = 'foo' and r.region = 'China'

编辑:

在我看来,无论所有连接表中是否有值,您都希望获得所有结果。所以尝试左连接而不是内连接。尝试阅读SQL以了解这些查询的作用。

select u.fname, u.lname, u.role, u.username, r.building, r.room, r.region, 
a.office_bldg, a.office_num
from 
users u 
left join `resident assistant` r on (u.username = r.username) 
left join `area coordinator` a  on (u.username = a.username)
where
u.username = 'foo' and r.region = 'China'