Сложный запрос MySQL с несколькими операторами выбора
У меня есть три таблицы в Mysql, которые связаны между собой:
Профиль (ID, Имя, Материал..)
Контакт(ID, ProfileID,desc,Ord)
Адрес(ID, ProfileID,desc,Ord)
Теперь мне нужно выбрать весь профиль из таблицы профилей, с “desc”
поле из Контакта и Адреса, где Ord = 1. (это для функции поиска, где в таблице я буду отображать имя, основные контактные данные и главный адрес клиента.
В настоящее время я могу сделать это с помощью трех отдельных запросов SQL:
SELECT Name, ID FROM Profile WHERE name=”bla”
Затем в цикле foreach я выполню два других запроса:
SELECT ProfileID, desc FROM Contact WHERE ProfileID=MyProfileID AND Ord=1
SELECT ProfileID, desc FROM Address WHERE ProfileID=MyProfileID AND Ord=1
Я знаю, что вы можете сделать несколько SELECT
в одном запросе, есть ли способ, которым я мог бы сгруппировать все три SELECT
в один запрос?
3 ответа
Ты должен быть способен JOIN
таблицы на profile.id
и profileid
в других таблицах.
Если вы уверены, что profileid
существует во всех трех таблицах, то вы можете использовать INNER JOIN
, INNER JOIN
возвращает совпадающие строки во всех таблицах:
select p.id,
p.name,
c.desc ContactDesc,
a.desc AddressDesc
from profile p
inner join contact c
on p.id = c.profileid
inner join address a
on p.id = a.profileid
where p.name = 'bla'
and c.ord = 1
and a.ord = 1
Если вы не уверены, что у вас будут соответствующие строки, вы можете использовать LEFT JOIN
:
select p.id,
p.name,
c.desc ContactDesc,
a.desc AddressDesc
from profile p
left join contact c
on p.id = c.profileid
and c.ord = 1
left join address a
on p.id = a.profileid
and a.ord = 1
where p.name = 'bla'
Если вам нужна помощь в обучении JOIN
синтаксис, вот отличное визуальное объяснение объединений
Этот запрос ниже только выбирает столбец, когда ID
от Profile
таблица имеет по крайней мере одно совпадение с таблицами: Contact
а также Address
, Если один или оба из них обнуляются, используйте LEFT JOIN
вместо INNER JOIN
так как LEFT JOIN
отображает все записи из левой таблицы независимо от того, совпадает ли она с другими таблицами или нет.
SELECT a.*,
b.desc as BDESC,
c.desc as CDESC
FROM Profile a
INNER JOIN Contact b
ON a.ID = b.ProfileID
INNER JOIN Address c
ON a.ID = c.ProfileID
WHERE b.ORD = 1 AND
c.ORD = 1 AND
a.Name = 'nameHERE'
LEFT JOIN
версия:
SELECT a.*,
b.desc as BDESC,
c.desc as CDESC
FROM Profile a
INNER JOIN Contact b
ON a.ID = b.ProfileID AND b.ORD = 1
INNER JOIN Address c
ON a.ID = c.ProfileID AND c.ORD = 1
WHERE a.Name = 'nameHERE'
Чтобы получить дополнительные сведения о соединениях, перейдите по ссылке ниже:
Я создал рабочую демонстрацию как ваше требование:
Запрос ниже извлечет все соответствующие записи из database.its, получив идентификатор профиля, имя stufff и описание таблиц контактов.
select p.id,p.name,p.stauff,c.descr,a.descr from profile as p
inner join contact as c on c.profileid=p.id
inner join address as a on a.profileid=p.id
where p.name="bla" and c.ord=1 and a.ord=1