C# MySQL连接返回多行

C# MySQL连接返回多行,c#,mysql,join,left-join,C#,Mysql,Join,Left Join,我有一个MySQL语句,用于查询联系人表。当它们加载到myDataGrid中时,同一个联系人有多个副本(表中只有一个副本) 这让我相信我的MySQL语句有问题。这就是我目前所拥有的 myQuery.CommandText = @"SELECT contacts.contactID, contacts.companyID, companies.name, contacts.donestatus, employees.name, people.ID, people.firstname, peopl

我有一个
MySQL
语句,用于查询联系人表。当它们加载到my
DataGrid
中时,同一个联系人有多个副本(表中只有一个副本)

这让我相信我的
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";

我已经检查了这个方法,它肯定只被调用过一次,所以对我来说它一定是一条语句。多个
连接
是否会导致为每个成功的
连接
加载一个
联系人

在这种情况下,它取决于您希望显示的内容。如果一个联系人可以有多个相关公司、员工或人员,那么您将使用当前SQL返回一个记录,其中包含他们的每个组合。例如,如果一个联系人有两个,那么8行(即2x2x2)将返回该联系人

如果希望每个联系人的所有详细信息都在一行中,那么可以使用子查询将每个联系人的所有详细信息连接起来,然后将结果与联系人表连接起来

举个简单的例子:-

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

在执行此连接时,例如,联系人与两个公司关联,您将得到两行相同的联系人,每个公司一行。@JoachimIsaksson我以为会是这样。我需要使用其他类型的联接吗?您可以在数据库端运行此查询吗?我想你会在那里得到答案。@Ajay2707我为每个查询检索多行,因此它肯定是查询。如何排除复制副本?我应该使用不同的
吗?这是临时修复吗?您只需在db端使用硬线公司id执行。对于每个查询的多行,您将了解这一点。