Сложный запрос 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
Другие вопросы по тегам