(使用MySQL和PHP)充分利用表搜索結果和引用表
我有一個搜索表單,讓我的用戶輸入一個字符串,然後搜索特定條件的字符串。
我的問題是,用戶需要能夠搜索跨多個表「傳播」的信息。例如:
- 表 「用戶」 包含FNAME,LNAME,角色,用戶名(PK)
- 表 「居民助手」 中包含用戶名(FK到用戶),建築,室內,區域
- 表「區域協調員」包含用戶名(FK給用戶),office_bldg,office_num
而且我允許我的用戶通過名字,姓氏,建築物,地區,Office#進行搜索 - 所以我需要顯示結果跨越多個表格(即來自「用戶」和「駐地助理」的匹配記錄)
我一直在試驗Joins and Unions,但還沒有得到任何有用的東西。如果可能的話,我正在尋找最「通用」的SQL語句來處理任何搜索。
現在,我能想到做這些搜索的唯一方法是通過PHP中的大量處理,例如,查找名字,查詢返回用戶名,來自「用戶」的角色,以及然後有一堆if語句說:「如果角色是這樣的話,那麼搜索這張表的用戶名等於...」
有沒有更好的方法來做到這一點?
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
而且我確實有在DB值...
我建議不要使用這種格式。我會使用INNER JOIN的,因爲這種方法已被廢棄http://stackoverflow.com/questions/630943/should-i-use-the-sql-join-keyword-for-complex-joins-on-multiple-tables – 2009-06-29 06:23:54