2016-02-03 2 views
0

У меня есть оператор MySQL, который я использую для запроса таблицы контактов. Когда они загружаются в мой DataGrid, однако есть несколько копий одного и того же контакта (в таблице всего 1).MySQL присоединяется к возврату нескольких строк

Это заставляет меня думать, что что-то не так с моим заявлением MySQL. Это то, что у меня есть до сих пор;

myQuery.CommandText = @"SELECT contacts.contactID, contacts.companyID, 
companies.name, contacts.donestatus, employees.name, 
people.ID, people.firstname, people.lastname, 
contacts.contractID, contacts.date, contacts.time, 
presets.presettext, contacts.madeby, contacts.description 
FROM contacts 
LEFT OUTER JOIN companies ON contacts.companyID = companies.ID 
LEFT OUTER JOIN employees ON contacts.employeeID = employees.ID 
LEFT OUTER JOIN people ON contacts.personID = people.ID 
JOIN presets ON contacts.type = presets.presetIDFoxPro 
WHERE contacts.companyid = @CompanyID 
AND presets.presetreferencefoxpro = 8 
ORDER BY contacts.date DESC"; 

Я проверил метод, и он определенно называется только один раз, поэтому для меня это должно быть утверждение. Являются ли множественные JOINS результатом Contact, загружаемым за каждые JOIN, что является успешным?

+0

При выполнении этого соединения и - например - контакт связан с двумя компаниями, вы получите 2 строки обратно с одного контакта, по одному для каждой компании. –

+0

@JoachimIsaksson Я думал, что все будет так. Нужно ли использовать другой тип соединения? – CBreeze

+0

Вы могли бы запустить этот запрос в базе данных? Я думаю, вы получите ответ. – Ajay2707

ответ

0

В этой ситуации это зависит от того, что вы хотите отобразить. Если у контакта может быть несколько связанных компаний, сотрудников или людей, то вы будете возвращать запись с каждой комбинацией из них с вашим текущим SQL. Например, если контакт имел 2 из каждых, то 8 строк (то есть 2 x 2 x 2) вернулись бы для этого контакта.

Если вы хотите получить подробную информацию по одной строке для каждого контакта, вы можете использовать подзапросы, чтобы получить все детали, объединенные для каждого контакта, а затем присоединить результаты этого к таблице контактов.

Для простого примера: -

SELECT contacts.contactID, contacts.companyID, 
     sub_companies.name, contacts.donestatus, sub_employees.name, 
     sub_people.all_id, sub_people.all_firstname, sub_people.all_lastname, 
     contacts.contractID, contacts.date, contacts.time, 
     presets.presettext, contacts.madeby, contacts.description 
FROM contacts 
INNER JOIN presets ON contacts.type = presets.presetIDFoxPro 
LEFT OUTER JOIN 
(
    SELECT ID, GROUP_CONCAT(name) 
    FROM companies 
    GROUP BY ID 
) sub_companies ON contacts.companyID = sub_companies.ID 
LEFT OUTER JOIN 
(
    SELECT ID, GROUP_CONCAT(name) 
    FROM employees 
    GROUP BY ID 
) sub_employees ON contacts.employeeID = sub_employees.ID 
LEFT OUTER JOIN 
(
    SELECT ID, GROUP_CONCAT(ID) AS all_id, GROUP_CONCAT(firstname) AS all_firstname, GROUP_CONCAT(lastname) AS all_lastname 
    FROM people 
    GROUP BY ID 
) sub_people ON contacts.personID = sub_people.ID 
WHERE contacts.companyid = @CompanyID 
AND presets.presetreferencefoxpro = 8 
ORDER BY contacts.date DESC