Получение результатов поиска из таблиц и ссылочных таблиц - PullRequest
0 голосов
/ 29 июня 2009

(с использованием MySQL и PHP)

У меня есть поисковая форма, которая позволит моим пользователям вводить строку и искать эту строку по определенным критериям.

Моя проблема в том, что пользователь должен иметь возможность искать информацию, которая «распределена» по нескольким таблицам. Например:

-Таблица «users» содержит имя, имя, роль, имя пользователя (PK)

-Table "Resident Assistant" содержит имя пользователя (FK для пользователей), здание, комната, регион

-Таблица «Координатор области» содержит имя пользователя (FK для пользователей), office_bldg, office_num

И я разрешаю своим пользователям выполнять поиск по имени, фамилии, зданию, региону, офису # - поэтому мне нужно будет показать результаты, которые охватывают несколько таблиц (т. Е. Совпадают записи от «пользователей» и «помощника по месту жительства» )

Я экспериментировал с Объединениями и Союзами, но не получил ничего полезного. Я ищу наиболее универсальный оператор 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

И у меня есть значения в БД ...

1 Ответ

2 голосов
/ 29 июня 2009

С чем-то вроде следующего вам нужно будет только встроить код в предложение 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'

EDIT:

Мне кажется, что вам нужны все результаты, независимо от того, есть ли значения во всех соединенных таблицах. Так что попробуйте левые соединения вместо внутренних. Попробуйте прочитать на 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...