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 odpowiedzi
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());
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
Podobne pytania
Nowe pytania
mysql
MySQL to darmowy system zarządzania relacyjnymi bazami danych (RDBMS) o otwartym kodzie źródłowym, który wykorzystuje język SQL (Structured Query Language). NIE UŻYWAJ tego znacznika dla innych baz danych, takich jak SQL Server, SQLite itp. Są to różne bazy danych, które używają własnych dialektów SQL do zarządzania danymi.