SQL JOIN – нужно вернуть один идентификатор продукта, но все его варианты (например, размер, цвет)

У меня есть несколько таблиц, к которым я присоединяюсь, чтобы отображать детали моего продукта из таблицы запасов. Поэтому один идентификатор продукта может иметь много записей в таблице запасов из-за нескольких цветов и размеров.

Таблица 1: tblStock

 stockID productID sizeID colourID qty 

Таблица 2: tblColour

  colourID colourName colourHEX 

Таблица 3: tblSize

  sizeID sizeName 

Мой запрос:

  SELECT p.productID, c.colourName, c.colourHEX, sz.sizeName, s.qty FROM tblProducts p INNER JOIN tblStock s ON p.productID = s.productID INNER JOIN tblColour c ON s.colourID = c.colourID INNER JOIN tblSize sz ON s.sizeID = sz.sizeID WHERE p.productID = '$id' 

возвращается:

  productID colourName colourHEX sizeName qty 4 Burgundy #621b40 Small 10 4 Burgundy #621b40 Medium 15 4 Burgundy #621b40 Large 20 4 Pink #ba0046 Large 20 

Есть ли способ, что я могу только вернуть идентификатор продукта один раз, но сохранить все его варианты?

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

Related of "SQL JOIN – нужно вернуть один идентификатор продукта, но все его варианты (например, размер, цвет)"

Вы можете использовать функцию group_concat

 SELECT p.productID, group_concat(distinct c.colourName), group_concat(distinct c.colourHEX), group_concat(distinct sz.sizeName), sum(s.qty) FROM tblProducts p INNER JOIN tblStock s ON p.productID = s.productID INNER JOIN tblColour c ON s.colourID = c.colourID INNER JOIN tblSize sz ON s.sizeID = sz.sizeID WHERE p.productID = '$id' group by p.productID ;// group by required only if you product id clause is removed 

Я не привык к PHP, но ваша проблема очень проста.

Все, что вам нужно, это отдельная переменная внутри цикла:

 sql="SELECT p.productID, c.colourName, c.colourHEX, sz.sizeName, s.qty" sql=sql+"FROM tblProducts p" sql=sql+"INNER JOIN tblStock s ON p.productID = s.productID" sql=sql+"INNER JOIN tblColour c ON s.colourID = c.colourID" sql=sql+"INNER JOIN tblSize sz ON s.sizeID = sz.sizeID" sql=sql+"WHERE p.productID = '$id'" Set rs = RecordSetForStoringSQLQueryResult -- Replace with appropriate code in PHP rs.Open (connectionName, sql) $prevProductID = Null; -- Or some other number while not rs.EndOfFile $currentId = rs("productID") if ($currentId != $lastId) { -- New ID found, display it. echo($currentId); $prevProductID = $currentId } else { -- Code for logic when the current product ID is same as previous product ID -- You will not assign anything to $prevProductID in this section. } rs.MoveToNextRecord end while 

Пожалуйста, считайте, что я не парень PHP, но я сделал аналогичные вещи в классическом ASP. Вышеприведенный код предназначен только для иллюстрации, и он не может использоваться напрямую. Вам нужно будет настроить его в соответствии с вашим планом.