2016-04-30 7 views
0

Простые программисты. У меня есть 3 таблицы со следующими примерами записей.mysql: запрос нескольких записей в 3 таблицах?

tbl_members имеет:

mem_id | mem_fname | mem_lname 
    1 | Ryan  | Layos 
    2 | Dhave | Sebastian 
    3 | Staven | Siegal 
    4 | Ma Ethel | Yocop 
    5 | Kelvin | Salvador 
    6 | Herbert | Ares 

tbl_member_status имеет:

status_id | mem_id | leader_id | process_id 
    1  | 2 |  1  | 2 
    2  | 3 |  5  | 3 
    3  | 4 |  6  | 4 
    4  | 5 |  1  | 4 
    5  | 1 |  6  | 4 

(tbl_member_status.mem_id чужд ключ к tbl_members.mem_id и leader_id также иностранный ключ к tbl_members.mem_id, потому что в моем случае элемент может быть лидером. 1 член 1 лидер)

tbl_process имеет:

process_id | process_type 
    1  | CONSOLIDATION 
    2  | PRE-ENCOUNTER 
    3  | ENCOUNTER 
    4  | POST-ENCOUNTER 

(член имеет процесс принятия, который я использовал перечисление со значениями: УКРЕПЛЕНИЕ, PRE-ENCOUNTER, знакомст-, POST-ENCOUNTER и т.д.)

Мой вопрос теперь правильный запрос SQL в получении желаемый выходной запрос, подобный этому.

tbl_query_result

mem_id | member_fname | member_lname | leader_fname | leader_lname | process_type 
    2  | dhave  | sebastian | Ryan  | Layos  | PRE-ENCOUNTER 
    5  | Kelvin  | Salvador | Ryan  | Layos  | POST-ENCOUNTER 

помните, что две колонны tbl_member_status имеет в виду один столбец tbl_members, который mem_id.

UPDATE:

то, что я сделал до сих пор:

SELECT member.mem_fname, member.mem_lname, leader.mem_fname, leader.mem_lname, tbl_process.process_type 
FROM 
    tbl_member_status as mem_stats 
INNER JOIN 
    tbl_members as member 
INNER JOIN 
    tbl_members as leader 
INNER JOIN 
    tbl_members ON mem_stats.member_id = member.mem_id 
INNER JOIN 
    tbl_process ON tbl_process.process_id = mem_stats.process_id 
WHERE 
    leader.mem_fname = 'Ryan' 

Этот запрос получает все записи, даже если leader.mem_fname не равен 'Ryan'

+0

Хороший вопрос. Обычно ваши коллеги-программисты любят видеть вашу собственную попытку, прежде чем отправлять их. – e4c5

ответ

-1

Потому что, когда вы запрашиваете. Количество строк в результате имеет значение. Например: если ваш результат для fname = ryan, но тогда совпадение mem.id в таблице memberstatus равно двум, а затем в таблице процессов снова два. У вас будет 2 строки в финальном выпуске. Вы можете попробовать это:

Select M.member_fname, M.mem_lname P.process_type from tbl_members M, tbl_member_status MS, tbl_process P where M.mem_id = MS.mem_id and MS.process_id = P.process_id and where M.member_fname = 'ryan' 

Хорошо я понял ваш вопрос в первую очередь. У меня есть решение для вас, которое улучшит вашу схему базы данных. Если у одного члена есть только один лидер, а у одного лидера много членов. Тогда почему бы не создать другую таблицу, называемую лидером, и напрямую подключиться к таблице участников? Так что это будет отношение один к одному. Это сделает запрос намного проще. Итак, теперь у вас есть 4 таблицы.

Select M.member_fname, M.mem_lname, L.fname, L.lname, P.process_type 
from tbl_members M, tbl_member_status MS, tbl_process P, tbl_leader L 
where M.leader_id = L.id and M.mem_id = MS.mem_id and MS.process_id = P.process_id and where M.member_fname = 'ryan' 
+0

каким-то образом я получаю ответ на мой вопрос, используя этот запрос (который вы предложили): 'ВЫБРАТЬ MEM.mem_fname как memFNAME, LEAD.mem_fname как leadFname, P.process_type ОТ \t tbl_member_status MS, tbl_members MEM, tbl_members LEAD , tbl_process Р ГДЕ \t MS.member_id = MEM.mem_id И MS.leader_id = LEAD.mem_id И MS.process_id = P.process_id И \t свинца.mem_fname = 'Ryan' ' – aintno12u

+0

Я думаю, что это так, ха-ха, я использовал внутреннее соединение в последний раз, но я не знал, что могу использовать« FROM имя таблицы, table_name, table_name ». какая разница? – aintno12u

+0

Оба они такие же, но отличаются с точки зрения мобильности, удобочитаемости и производительности. –

Смежные вопросы