【问题标题】:SQL JOIN - Need to return one product id but all variations of it (e.g. Size, colour)SQL JOIN - 需要返回一个产品 ID,但它的所有变体(例如尺寸、颜色)
【发布时间】:2013-03-18 01:31:42
【问题描述】:

我有几个要加入的表格,以从库存表格中显示我的产品详细信息。因此,由于多种颜色和尺寸,一个产品 ID 在库存表中可能有多个条目。

表一: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

有什么方法可以让我只返回一次产品 ID,但保留它的所有变体?

如果没有,我将如何将此产品回显到页面,因为我不希望它出现 4 次。只需出现一次,即可查看各种可用选项的详细信息。

【问题讨论】:

  • if ($currentId != $lastId) { ... } else { ... }
  • 与此处的答案相同,但注意事项与 cmets 中提到的相同:stackoverflow.com/questions/15462408/…
  • 您使用的是哪个 DBMS?甲骨文? Postgres?

标签: php sql


【解决方案1】:

你可以使用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 如何访问此查询的单个结果?例如。我需要呼应小件物品的数量和颜色?
  • 它只在行上返回,你可以给每列一个别名,以便在 php 中访问,group_concat(xxx) AS COL1。获取行后,执行 print_r/var_dump 以识别生成的键。
【解决方案2】:

我不习惯 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 中做过类似的事情。上面的代码仅用于说明目的,不能直接使用。您需要根据自己的计划对其进行调整。

【讨论】:

  • 我试试看。我尝试按 id 和不同的 id 分组。没有尝试过相反的方法
  • 是的,请注意他不是直接可用的代码。尝试正确理解 PHP 中的逻辑和代码。我希望你得到你正在寻找的解决方案。这对新手来说其实很困难,但如果你有足够的经验,这很简单。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多