MYSQL GROUP_CONCAT и полдюжины JOIN - PullRequest
       23

MYSQL GROUP_CONCAT и полдюжины JOIN

2 голосов
/ 17 февраля 2012

Я пытался заставить этот запрос работать, но сейчас я застрял.Проблема в соединении с GROUP_CONCAT в нем.Я просто не могу понять, как заставить его работать.

Я хочу получить пакет данных из запросов предложений и присоединения к нему Клиентов и т. Д., И все было в порядке, пока мне не пришлось изменить поле «Поставщики», чтобыв одной строке запроса может быть несколько отправителей.Я создал новые таблицы RFQsSuppliers, в которых я объединяю Supplier.ID и RFQs.ID, и у меня есть таблица Suppliers, содержащая имена и другие элементы.

Я хочу, чтобы поставщики разделяли всех поставщиков с помощью ','.

Мой запрос:

$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());

На данный момент ошибка: Неизвестный столбец «Имя поставщика» в «списке полей»

РЕДАКТИРОВАТЬ

НижеВот пример моей таблицы:

  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] =>) Массив ([Поставщики] =>)

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012
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

Попробуйте это

Я полагаю, что вы пропустили 's' в имени таблицы GROUP_CONCAT, так как оно было указано как Supplier.Name вместо Suppliers.name согласно таблице

Редактировать

Кроме того, вы ссылаетесь на RFQs.LastEdited в предложениях WHERE и ORDER BY, однако вы добавили в таблицу RFQ для именования Pullero, поэтому их нужно будет изменить на Pullero.LastEdited

Отредактировано редактировать Переформатировано, чтобы использовать СОЕДИНЕНИЯ вместо 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

Или для примера, использующего оригинальный подзапрос, ссылка RFQ кажется превосходной, поэтому я настроил ее + добавил список поставщиков в вывод

$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());
0 голосов
/ 17 февраля 2012

Вы ссылаетесь на столбец Supplier.Name, но объединение таблиц находится в таблице с именем Suppliers во множественном числе.

      (SELECT    RFQs.ID,
          /* Should be plural Suppliers.Name here... */
          GROUP_CONCAT(Suppliers.Name) AS Suppliers
       FROM      RFQs 
       LEFT JOIN RFQsSuppliers ON RFQs.ID = RFQsSuppliers.RFQID
       JOIN      Suppliers ON RFQsSuppliers.SupplierID = Suppliers.ID
       GROUP BY  RFQs.ID) 

Позже, в вашем последнем предложении WHERE вы ссылаетесь на RFQs, однако вы назвали эту таблицу как Pullero:

FROM       RFQs Pullero

Измените предложение WHERE на

WHERE      Pullero.LastEdited > '$lastedited'
           ORDER BY   Pullero.LastEdited ASC
...