2016-06-16 4 views
0

У меня есть три таблицыОбъединение нескольких таблиц в MYSQL с ошибкой (

phoneRecord - ID,phone 
companies - ID,phone1,phone2, name 
contacts - ID, phone1, phone2, companies.ID 

Я хочу присоединиться таблицы записи телефонных разговоров для компаний и контактов, из которых я могу сделать так, со следующим:

SELECT 
    phoneRecord.*, 
    companies.ID, 
    contacts.ID, 
FROM phoneRecord 
    LEFT JOIN contacts 
    ON phoneRecord.Phone=contacts.Phone1 OR phoneRecord.Phone=contacts.Phone2 
    LEFT JOIN companies ON phoneRecord.Phone=companies.phone1 OR phoneRecord.phone=companies.phone2 

Однако, мне нужно только еще одну вещь. Когда контакт возвращается, я хотел бы знать компанию контакт находится в (если contact.companies соответствует company.id). можно ли это сделать?

У меня есть попробовал что-то вроде:

SELECT 
    phoneRecord.*, 
    companies.ID, 
    companies.name, 
    contacts.ID, 
FROM phoneRecord 
    LEFT JOIN contacts 
     LEFT JOIN companies ON contacts.company=companies.ID 
    ON phoneRecord.Phone=contacts.Phone1 OR phoneRecord.Phone=contacts.Phone2 
    LEFT JOIN companies ON phoneRecord.Phone=companies.phone1 OR phoneRecord.phone=companies.phone2 

но его код ошибки 1066: Не уникальная таблица/псевдоним: «компании».

Я включил код, как предположил Томас, но он дал мне ту же ошибку. Возможно, я неправильно истолковал, что он имел в виду. Код следующим образом:

SELECT 
    phoneRecord.*, 
    companies.ID, 
    companies.name, 
    contacts.ID, 
FROM phoneRecord 
    LEFT JOIN contacts ON phoneRecord.Phone=contacts.Phone1 OR phoneRecord.Phone=contacts.Phone2 
    LEFT JOIN companies ON contacts.company=companies.ID 
    LEFT JOIN companies ON phoneRecord.Phone=companies.phone1 OR phoneRecord.phone=companies.phone2 

Я получил его, наконец, работать с этим:

SELECT 
    phoneRecordID, 
    phoneRecordPhone, 
    companyID, 
    contactsID, 
    contactsCompany, 
    companies.name 
    FROM(
SELECT 
    phoneRecord.ID as phoneRecordID, 
    phoneRecord.Phone as phoneRecordPhone, 
    companies.ID as companyID, 
    contacts.ID as contactsID, 
    contacts.company as contactsCompany 
FROM phoneRecord 
    LEFT JOIN contacts 
    ON phoneRecord.Phone=contacts.Phone1 OR phoneRecord.Phone=contacts.Phone2 
    LEFT JOIN companies ON phoneRecord.Phone=companies.phone1 OR phoneRecord.phone=companies.phone2) as result 
LEFT JOIN companies ON contactsCompany = companies.id 

Спасибо, это было супер полезно.

+0

Вы пропустили ключевое слово ON и определили ключи после «LEFT JOIN contacts» – Thomas

+0

Не так плохо, ваш запрос, просто введите строку «LEFT JOIN companies ON contacts.company = company.ID» под «ON phoneRecord.Phone = contacts.Phone1 OR phoneRecord.Phone = contacts.Phone2 "строка, это просто синтаксическая ошибка, вы делали хорошо :) – Thomas

+0

Он по-прежнему дает мне такую ​​же ошибку, к сожалению. –

ответ

0

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

SELECT cmid from(SELECT 
    phoneRecord.*, 
    companies.ID as cmid, 
    contacts.ID, 
    FROM phoneRecord 
    LEFT JOIN contacts 
    ON phoneRecord.Phone=contacts.Phone1 OR phoneRecord.Phone=contacts.Phone2 
    LEFT JOIN companies ON phoneRecord.Phone=companies.phone1 OR phoneRecord.phone=companies.phone2) as result 
    left join contacts on contacts.ID = result.cmid 
+0

Я попытался использовать код, который вы указали, но он не работает. Ошибка: Ошибка SQL (1064): у вас есть ошибка в синтаксисе SQL ..... рядом с 'FROM phoneRecord LEFT JOIN контакты ON phoneRecord.Phone = contacts.Phone1 O 'в строке 5 –

+0

@ yukei wong У вас есть основная идея из моего примера, это главное. –

0

Это еще один подход, чтобы сделать это -

WITH CompanyInfo As(
    SELECT 
    phoneRecord.ID as phoneRecordID, 
    phoneRecord.Phone as phoneRecordPhone, 
    companies.ID as companyID, 
    contacts.ID as contactsID, 
    contacts.company as contactsCompany 
    FROM phoneRecord 
    LEFT JOIN contacts 
    ON phoneRecord.Phone=contacts.Phone1 OR phoneRecord.Phone=contacts.Phone2 
    LEFT JOIN companies ON phoneRecord.Phone=companies.phone1 OR phoneRecord.phone=companies.phone2 
    ) 

    SElECT * FROM CompanyInfo 
    LEFT JOIN companies ON CompanyInfo.contactsCompany = companies.id 
0

СУБД жалуется, потому что вы присоединяетесь к companies дважды, и он не знает, какую запись из двух вы говорите, например, при использовании companies.phone1. Вы должны указать два разных псевдонима, чтобы отличить их. Например:

left join companies com on p.phone in (com.phone1, com.phone2) 
left join contacts con on p.phone in (con.phone1, con.phone2) 
left join companies concom on con.company = concom.id 

Однако, мне кажется, что вы выбираете две разные вещи:

  1. записи телефонных контактов (в компании)
  2. записи телефонных разговоров для компаний

Так вы может хотите два запроса, результаты которых вы комбинируете:

select p.*, com.id as company_id, com.name, con.id as contact_id 
from phonerecord p 
join contacts con on p.phone in (con.phone1, con.phone2) 
join companies com on con.company = com.id 
union all 
select p.*, com.id as company_id, com.name, null as contact_id 
from phonerecord p 
join companies com on p.phone in (com.phone1, com.phone2); 
Смежные вопросы