【问题标题】:Getting search results from table and referencing tables从表和引用表中获取搜索结果
【发布时间】:2009-06-29 06:09:18
【问题描述】:

(使用 MySQL 和 PHP)

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

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

-表“users”包含fname、lname、角色、用户名(PK)

- 表“常驻助手”包含用户名(对用户的 FK)、建筑物、房间、区域

-表“区域协调员”包含用户名(对用户的 FK)、office_bldg、office_num

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

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

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

有没有更好的方法来做到这一点?


文科-

我实际上没有收到错误,查询(具有多个连接)只是返回 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

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

【问题讨论】:

    标签: php mysql search


    【解决方案1】:

    使用如下内容,您只需要在代码中构建 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'
    

    【讨论】:

    • 我建议不要使用这种格式。我会改用 INNER JOIN,因为这种方法已被弃用 stackoverflow.com/questions/630943/…
    • 您能否指出关于隐含连接语法弃用的更好参考?这个问题只提了,没有任何证据。
    • 非常感谢您的帮助!
    • Vinko- 我似乎只能让您的示例查询使用一个连接,而不是两个连接。关于为什么会这样的任何想法?
    • 把你失败的查询作为编辑,出乎意料的是,我不知道可能出了什么问题。另外,除了查询之外,请输入您遇到的错误。
    猜你喜欢
    • 2012-04-10
    • 2016-07-12
    • 1970-01-01
    • 2014-01-29
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多