MYSQL GROUP_CONCAT 和半剂量 JOIN

标签 mysql join group-concat

我一直在尝试让这个查询工作,但现在我被难住了。 问题出在其中包含 GROUP_CONCAT 的 JOIN 上。我只是不知道如何让它工作。

我想要的是从 RFQ 中获取一堆数据并将客户等加入其中,一切都很好,直到我不得不更改供应商字段,以便每个 RFQ 行可以有多个供应商。我创建了新表 RFQsSuppliers,其中组合了Supplier.ID 和 RFQs.ID,并且我有包含名称和其他内容的供应商表。

我想让供应商将所有供应商用“,”分隔。

我的查询:

$result = mysql_query("SELECT     Pullero.DateAdded as DateAdded,
                              Customers.Name as customer,
                              Pullero.ID as RFQID,
                              Ships.Name as ship,
                              Pullero.CustomerRef as CustomerRef,
                              Contacts.FirstName as contactF,
                              Contacts.LastName as contactL,
                              Contacts.Email as contactE,
                              Users.tunnus as handler,
                              RFQStatus.Name as status,
                              Pullero.Description as RFQDescription,
                              Pullero.LastEdited as LastEdit
                   FROM       RFQs Pullero
                   JOIN      (SELECT    RFQs.ID,
                                        GROUP_CONCAT(Supplier.Name) AS Suppliers
                              FROM      RFQs 
                              LEFT JOIN RFQsSuppliers ON RFQs.ID = RFQsSuppliers.RFQID
                              JOIN      Suppliers ON RFQsSuppliers.SupplierID = Suppliers.ID
                              GROUP BY  RFQs.ID) 
                              RFQsSuppliers ON Pullero.ID = RFQsSuppliers.RFQID

                   LEFT JOIN  Ships ON RFQ.ShipID=Ships.ID
                   LEFT JOIN  Contacts ON RFQ.ContactID=Contacts.ID
                   LEFT JOIN  Customers ON RFQ.CustomerID=Customers.idCustomers
                   LEFT JOIN  Users ON RFQ.PriJobHandler=Users.id
                   LEFT JOIN  RFQStatus ON RFQ.StatusID=RFQStatus.ID
                   WHERE      RFQs.LastEdited > '$lastedited'
                   ORDER BY   RFQs.LastEdited ASC
                  ") or die(mysql_error());

目前,错误是:“字段列表”中的未知列“Supplier.Name”

编辑

下面是我的表格设计的一些示例:

  RFQs
  ID | DateAdded | CustomerID | ShipID | LastEdited | StatusID ...

  /* -------------------------------------- */
  Suppliers
  ID | Name | CountryID
  1    Sup1   2
  2    Sup2   5
  3    Sup3   3
  4    Sup4   3
  /* -------------------------------------- */
  RFQsSuppliers
  ID | RFQID | SupplierID
  1    1       4
  2    2       3
  3    56      3
  4    4       3
  5    39      1
  6    56      1
  7    4       4

我尝试仅获取具有以下查询的供应商:

$result = mysql_query("SELECT     Suppliers.Name as Suppliers
                   FROM       RFQs
                   LEFT JOIN  RFQsSuppliers ON RFQs.ID=RFQsSuppliers.SupplierID
                   LEFT JOIN  Suppliers ON RFQsSuppliers.SupplierID=Suppliers.ID
                   GROUP BY   RFQs.ID
                  ") or die(mysql_error());

但是每行的 print_r 仅返回以下内容:

Array ( [Suppliers] => Sup1,Sup1 ) Array ( [Suppliers] => ) Array ( [Suppliers] => Sup4,Sup4 ) Array ( [Suppliers] => ) Array ( [Suppliers] => ) Array ( [Suppliers] => )

有什么想法吗?

最佳答案

JOIN      (
    SELECT    RFQs.ID,
              GROUP_CONCAT(Supplier**s**.Name) AS Suppliers
    FROM      RFQs 
    LEFT JOIN RFQsSuppliers ON RFQs.ID = RFQsSuppliers.RFQID
    JOIN      Suppliers ON RFQsSuppliers.SupplierID = Suppliers.ID
    GROUP BY  RFQs.ID
) RFQsSuppliers

试试这个

我相信您在 GROUP_CONCAT 表名称中漏掉了一个“s”,因为您将其作为Supplier.Name 而不是表中的Suppliers.name

编辑

此外,您在 WHERE 和 ORDER BY 子句中引用了 RFQs.LastEdited,但是您将表 RFQ 的别名命名为 Pullero,因此需要将其更改为 Pullero.LastEdited

编辑编辑重新格式化以使用 JOIN 而不是 SUBQUERY

SELECT     
    Pullero.DateAdded as DateAdded,
    Customers.Name as customer,
    Pullero.ID as RFQID,
    GROUP_CONCAT(Suppliers.Name) AS Suppliers,
    Ships.Name as ship,
    Pullero.CustomerRef as CustomerRef,
    Contacts.FirstName as contactF,
    Contacts.LastName as contactL,
    Contacts.Email as contactE,
    Users.tunnus as handler,
    RFQStatus.Name as status,
    Pullero.Description as RFQDescription,
    Pullero.LastEdited as LastEdit

FROM       RFQs AS Pullero
LEFT JOIN  RFQsSuppliers ON RFQsSuppliers.RFQID = Pullero.ID
LEFT JOIN  Suppliers ON RFQSuppliers.SupplierID = Suppliers.ID
LEFT JOIN  Ships ON RFQ.ShipID=Ships.ID
LEFT JOIN  Contacts ON RFQ.ContactID=Contacts.ID
LEFT JOIN  Customers ON RFQ.CustomerID=Customers.idCustomers
LEFT JOIN  Users ON RFQ.PriJobHandler=Users.id
LEFT JOIN  RFQStatus ON RFQ.StatusID=RFQStatus.ID
WHERE      Pullero.LastEdited > '$lastedited'
ORDER BY   Pullero.LastEdited ASC

或者对于使用原始子查询的示例,RFQs 链接似乎是多余的,因此我对其进行了调整+已将供应商列表添加到输出中

$result = mysql_query("SELECT     Pullero.DateAdded as DateAdded,
                              RFQsSuppliers.Suppliers,
                              Customers.Name as customer,
                              Pullero.ID as RFQID,
                              Ships.Name as ship,
                              Pullero.CustomerRef as CustomerRef,
                              Contacts.FirstName as contactF,
                              Contacts.LastName as contactL,
                              Contacts.Email as contactE,
                              Users.tunnus as handler,
                              RFQStatus.Name as status,
                              Pullero.Description as RFQDescription,
                              Pullero.LastEdited as LastEdit
                   FROM       RFQs Pullero
                   JOIN      (
                      SELECT    RFQsSuppliers.RFQID,
                                GROUP_CONCAT(Suppliers.Name) AS Suppliers
                      FROM      RFQsSuppliers.RFQID
                      JOIN      Suppliers ON RFQsSuppliers.SupplierID = Suppliers.ID
                      GROUP BY  RFQsSuppliers.RFQID
                    ) AS RFQsSuppliers ON Pullero.ID = RFQsSuppliers.RFQID
                   LEFT JOIN  Ships ON RFQ.ShipID=Ships.ID
                   LEFT JOIN  Contacts ON RFQ.ContactID=Contacts.ID
                   LEFT JOIN  Customers ON RFQ.CustomerID=Customers.idCustomers
                   LEFT JOIN  Users ON RFQ.PriJobHandler=Users.id
                   LEFT JOIN  RFQStatus ON RFQ.StatusID=RFQStatus.ID
                   WHERE      Pullero.LastEdited > '$lastedited'
                   ORDER BY   Pullero.LastEdited ASC
                  ") or die(mysql_error());

编辑更新了问题第二部分的查询

$result = mysql_query("SELECT RFQs.ID, GROUP_CONCAT(Suppliers.Name) as Suppliers
                   FROM       RFQs
                   LEFT JOIN  RFQsSuppliers ON RFQs.ID=RFQsSuppliers.RFQID
                   LEFT JOIN  Suppliers ON RFQsSuppliers.SupplierID=Suppliers.ID
                   GROUP BY   RFQs.ID
                  ") or die(mysql_error());

关于MYSQL GROUP_CONCAT 和半剂量 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329275/

相关文章:

php - 连接两个表并得到结果

mysql group_concat 仅当连续日期

sql - 我们可以在 PostgreSQL 中定义一个 GROUP_CONCAT 函数吗?

mysql - INSTR() 和 GROUP_CONCAT() 在服务器之间返回不同的结果

php - 我应该从 Zend_Db 移植到哪个 native mysql 类? (无 PDO 或 Mysqli)

mysql - 功能(SELECT x,y ...)不起作用

mysql - Laravel 5.2 查询将第一个表和第二个表的结果相交

php - mysql_query() 在数据库中搜索文本字符串时返回 false

sql - 加入条件 "ON"与 "WHERE"

mysql - SQL 使用 FOREIGN KEYS 选择行