2009-06-29 55 views
0

(使用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值...

回答

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' 
+1

我建議不要使用這種格式。我會使用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