Próbowałem sprawić, by to zapytanie zadziałało, ale teraz jestem sparaliżowany. Problem jest na JOIN z GROUP_CONCAT w nim. Po prostu nie wiem, jak sprawić, żeby to działało.

To, czego chcę, to uzyskać pakiet danych z zapytań ofertowych i dołączających do niego klientów itp. I wszystko było w porządku, dopóki nie musiałem zmienić pola Dostawcy, aby mogło mieć wielu dostawców w jednym wierszu ZO. Utworzyłem nowe tabele RFQsSuppliers, w których łączę Supplier.ID i RFQs.ID i mam tabelę Suppliers zawierającą nazwy i inne rzeczy.

Chcę, aby Dostawcy mieli wszystkich dostawców oddzielonych „,”.

Moje zapytanie:

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

W tej chwili błąd to :Nieznana kolumna 'Dostawca.Nazwa' w 'liście pól'

EDYTOWAĆ

Poniżej znajduje się przykład mojego projektu tabeli:

  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

Próbowałem uzyskać tylko dostawców z następującym zapytaniem:

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

Ale print_r w każdym wierszu zwraca tylko następujące wartości:

Tablica ( [Dostawcy] => Sup1,Sup1 ) Tablica ( [Dostawcy] => ) Tablica ( [Dostawcy] => Sup4,Sup4 ) Tablica ( [Dostawcy] => ) Tablica ( [Dostawcy] => ) Tablica ( [Dostawcy] ] => )

Jakieś pomysły?

2
Santtu 17 luty 2012, 17:41

2 odpowiedzi

Najlepsza odpowiedź
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

Spróbuj tego

Uważam, że pominąłeś „s” w nazwie tabeli GROUP_CONCAT, ponieważ miałeś ją jako Dostawca.Nazwa zamiast Dostawcy.Nazwa zgodnie z tabelą

Edytuj

Dodatkowo odwołujesz się do ZO

Edytowana edycja Sformatowano ponownie, aby używać JOIN zamiast 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

Lub na przykład używając oryginalnego podzapytania, łącze ZO wydaje się zbyteczne, więc dostosowałem go + dodałem listę dostawców do danych wyjściowych

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

EDYTUJ Zaktualizowano zapytanie dotyczące drugiej części pytania

$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());
2
Simon at My School Portal 19 luty 2012, 01:57

Odwołujesz się do kolumny Supplier.Name, ale złączenie tabeli jest w tabeli o nazwie Suppliers, liczba mnoga.

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

Później, w ostatniej klauzuli WHERE, odwołujesz się do RFQs, jednak aliasujesz tę tabelę jako Pullero:

FROM       RFQs Pullero

Zmień klauzulę WHERE do użycia

WHERE      Pullero.LastEdited > '$lastedited'
           ORDER BY   Pullero.LastEdited ASC
0
Michael Berkowski 17 luty 2012, 17:56