Java 为什么这些连接查询返回重复的记录?

Java 为什么这些连接查询返回重复的记录?,java,mysql,core,Java,Mysql,Core,表结构: Field Type Null Default -------------------------------------------------------------------- OrderId bigint(20) Yes II is a Primary key CustomerID bigint(20)

表结构:

    Field                Type           Null        Default
    --------------------------------------------------------------------
    OrderId               bigint(20)     Yes        II is a Primary key 
    CustomerID            bigint(20)     Yes        
    OrderDate             date           Yes        
    ShippedDate           date           Yes        NULL
    Freight               int(20)        Yes        NULL
    ShipName              varchar(50)    Yes        NULL
    ShipAddress           varchar(100)   Yes        NULL
    ShipCity              varchar(50)    Yes        NULL
    ShipPostalCode        int(20)        Yes        NULL
    ShipCountry           varchar(30)    Yes        NULL
    ShipVia               int(50)        Yes        1
    customerPayA          int(11)        Yes         
    discount              int(11)        Yes        
    shippingPackagingCost int(11)        Yes     
    grandTotal            int(11)        Yes        NULL
    remainPayment         int(20)        Yes        NULL
    Table structure for table orderdetails
    Field            Type            Null        Default
    ProductId        int(20)        Yes        
    OrderId          int(20)        Yes        
    UnitPrice        int(200)       Yes        
    Qty              int(20)        Yes        
    vat              int(11)        Yes        
    Amount           int(20)        Yes        
    Table structure for table products
    Field        Type        Null        Default
    ProductId     int(20)        Yes        
    ProductName   varchar(50)    Yes        
    Table structure for table shippers
    Field        Type        Null        Default
    ShipperID    int(11)       Yes        
    companyName  varchar(30)   Yes            
    Table structure for table customers
    Field               Type        Null        Default
    CustomerID        int(20)            Yes        
    firstName         varchar(20)        Yes        
    middleName        varchar(20)        Yes        
    LastName          varchar(20)        Yes        
    address           varchar(200)       Yes        
    city              varchar(20)        Yes        
    postalcode        int(10)            Yes        
    country           varchar(20)        Yes  
选择查询:

SELECT DISTINCT
    o.OrderID, o.CustomerID, 
    c.firstName as BillName , 
    s.CompanyName as ShipperName,  
    p.ProductName, od.UnitPrice, od.Qty, od.Amount,  
    o.grandTotal 
FROM 
    Orders o  
JOIN 
    Customers c ON o.CustomerID = c.CustomerID  
JOIN  
    Shippers s ON o.ShipVia = s.ShipperID  
JOIN 
    OrderDetails od ON o.OrderID = od.OrderID  
JOIN 
    Products p ON od.ProductID = p.ProductID  
WHERE 
    o.OrderID =46 
  • orderid下的order表是主键
  • customerid下的customer表是主键
  • shipperid下的shippers表是主键
  • [![sql选择查询下的图像及其输出非常有用,便于理解][1][1]

    输出如下所示:

    OrderID CustomerID         BillName Shipper Product UnitPrice         Qty Amount grandTotal
    
        46                  1              bharat         balaji         evergreent         400         4         1600         3885
        46                  1              bharat         balaji         evergreent         400         4         1600         3885
        46                  1              bharat         balaji         corogen         700         3         2100         3885
        46                  1              bharat         balaji         corogen         700         3         2100         3885
    

    您正在通过以下方式查找组:

    您的查询应如下所示:-

     "SELECT o.OrderID, o.CustomerID, o.OrderDate, o.ShippedDate, o.Freight, o.customerPayAmount, " +
                    "o.ShipName, o.ShipAddress, o.ShipCity, o.ShipPostalCode, o.ShipCountry, " +
                    "c.firstName as BillName, c.Address as BillAddress, " +
                    "c.City as BillCity, c.PostalCode as BillPostalCode, " +
                    "c.Country as BillCountry, s.CompanyName as ShipperName, " +
                    "p.ProductName, od.UnitPrice, od.Qty,od.Amount, " +
                    "o.discount, o.shippingPackagingCost, od.vat, o.grandTotal, o.remainPayment "+
                    "FROM Orders o " +
                    "JOIN Customers c ON " +
                    "o.CustomerID = c.CustomerID " +
                    "JOIN  Shippers s ON " +
                    "o.ShipVia = s.ShipperID " +
                    "JOIN OrderDetails od ON " +
                    " o.OrderID = od.OrderID " +
                    "JOIN Products p ON " +
                    "od.ProductID = p.ProductID " +
                    "WHERE o.OrderID = ? "+
                    "group by o.OrderID,c.firstName,s.CompanyName,od.UnitPrice,p.ProductName");
    

    您正在通过以下方式查找组:

    您的查询应如下所示:-

     "SELECT o.OrderID, o.CustomerID, o.OrderDate, o.ShippedDate, o.Freight, o.customerPayAmount, " +
                    "o.ShipName, o.ShipAddress, o.ShipCity, o.ShipPostalCode, o.ShipCountry, " +
                    "c.firstName as BillName, c.Address as BillAddress, " +
                    "c.City as BillCity, c.PostalCode as BillPostalCode, " +
                    "c.Country as BillCountry, s.CompanyName as ShipperName, " +
                    "p.ProductName, od.UnitPrice, od.Qty,od.Amount, " +
                    "o.discount, o.shippingPackagingCost, od.vat, o.grandTotal, o.remainPayment "+
                    "FROM Orders o " +
                    "JOIN Customers c ON " +
                    "o.CustomerID = c.CustomerID " +
                    "JOIN  Shippers s ON " +
                    "o.ShipVia = s.ShipperID " +
                    "JOIN OrderDetails od ON " +
                    " o.OrderID = od.OrderID " +
                    "JOIN Products p ON " +
                    "od.ProductID = p.ProductID " +
                    "WHERE o.OrderID = ? "+
                    "group by o.OrderID,c.firstName,s.CompanyName,od.UnitPrice,p.ProductName");
    

    你需要的是分组。如果需要返回多条记录,可能需要使用GROUP_CONCAT函数

    GROUP_CONCAT( p.ProductName )
    
    有关GROUP_CONCAT功能的更多信息,请访问开发者网站:


    您需要的是分组。如果需要返回多条记录,可能需要使用GROUP_CONCAT函数

    GROUP_CONCAT( p.ProductName )
    
    有关GROUP_CONCAT功能的更多信息,请访问开发者网站:


    您编写的查询很好,您使用了Distinct,这样它就不会返回重复的记录

    请检查表格的原始数据


    应该有重复的数据,但有微小的更改,如空格或不可见字符…

    您编写的查询很好,您使用了Distinct,因此它不应返回重复的记录

    请检查表格的原始数据



    应该有重复的数据,但有微小的变化,如空格或不可见字符…

    但是这个问题只返回productName=“evergreen”的一条记录,但我的要求是产品显示一次“evergreen”和“corogen”@Bharat我刚刚做了更新,我已将
    p.ProductName
    添加到组byTry
    p.ProductName
    请给出任何其他建议,但此问题仅返回一条ProductName=“evergreen”记录,但我的要求是产品显示一次“evergreen”和“corogen”@Bharat我刚做了更新,我已将
    p.ProductName
    添加到组中,请尝试
    按p.ProductName分组
    请给出任何其他建议,我也可以在上面显示result@Bharat到底是什么问题?哪个字段不在您的查询结果中?@PooyRaki问题是产品记录显示为两份。您可以查看上面的结果产品“evergreen”和“corogen”@Bharat所以我已经回答了在您的问题末尾添加p.ProductName的group_的问题请给我建议这也是同样的显示result@Bharat到底是什么问题?哪个字段不在您的查询结果中?@PooyRaki问题是产品记录显示为两份。您可以查看上面的结果产品“evergreen”和“corogen”@Bharat所以我已经回答了问题,请在您的问题末尾添加p.ProductName的group_请给我建议谢谢给我建议谢谢