在MySQL中使用MIN时获取行而不是列?

时间:2015-06-05 11:24:18

标签: mysql

我的MySQL查询有问题,因为我在联接的表格列中使用MIN()时尝试检索多个列(或整行)。

我试图通过一个例子让我的问题更清楚,我遗漏了很多连接和不必要的东西:

SELECT
    product.*,
    MIN(stock.qty)
FROM
    product
LEFT JOIN
    stock ON product.id = stock.id
GROUP BY
    product.id

我得到的结果现在是整个产品行和stock.qty列,但我想要检索具有最少数量的条目的整个stock行。 /> 这可能无法使用MIN()完成,但我的问题是,我该怎样才能实现这一目标?

提前致谢

更新: 这是一个SQL小提琴,可以进行更多解释:

您在此处看到Product A加入库存商品2的数量,这是正确的,它是10,产品A的另一个库存商品是15。但是,我还想检索同一行的backorders字段 ,即1,但我的查询返回0作为延期交货,来自库存行1

http://sqlfiddle.com/#!9/b232e/3/0

4 个答案:

答案 0 :(得分:0)

    SELECT
  name,
  stock.id,
  s.product_id,
  qty,
  backorders
    FROM product p
  LEFT JOIN (stock
    INNER JOIN (SELECT
        MIN(qty) q,
        s.product_id
      FROM stock s
      GROUP BY s.product_id) s
      ON s.q = stock.qty
      AND s.product_id = stock.product_id)
    ON p.id = s.product_id

答案 1 :(得分:0)

SELECT
    product.*,
    s1.*
FROM
    product
LEFT JOIN
    stock s1 ON product.id = s1.product_id
LEFT JOIN
    stock s2 ON product.id = s2.product_id AND s1.qty > s2.qty
WHERE
    s2.qty IS NULL

假设每种产品只有一个最小数量的库存。 http://sqlfiddle.com/#!9/b232e/7

http://sqlfiddle.com/#!9/d2d89/3

SELECT
    product.*,
    s1.*
FROM
    product
LEFT JOIN
    stock s1 ON product.id = s1.product_id
LEFT JOIN
    stock s2 ON product.id = s2.product_id
        AND (s1.qty > s2.qty or (s1.qty = s2.qty and s1.id > s2.id))
WHERE
    s2.qty IS NULL

如果一种产品的两种库存最少,那么选择ID较小的种类。

答案 2 :(得分:0)

虽然MySQL允许您从分组表中任意返回 值,但更好的方法是沿着子查询路由返回,以加入数据,如下所示:

SELECT      p.*,
            s.qty,
            s.backorders

FROM (
    SELECT      MIN(stock.qty) AS qty,
                stock.product_id

    FROM        stock

    GROUP BY    stock.product_id
) minstock

INNER JOIN  stock s
    ON      minstock.product_id = s.product_id
    AND     minstock.qty = s.qty

RIGHT JOIN  product p
    ON      p.id = s.product_id

现在,如果有多个行共享特定产品的相同最低库存,它们都将返回,但您会看到每个行的延期交货数量。

答案 3 :(得分:0)

SELECT p.* 
     , s.*
  FROM product p
  LEFT 
  JOIN 
     ( SELECT x.* 
         FROM stock x
         JOIN
            ( SELECT product_id
                   , MIN(stock.qty) min_qty
                FROM stock
               GROUP
                  BY product_id
            ) y
           ON y.product_id = x.product_id
          AND y.min_qty = x.qty
     ) s
    ON s.product_id = p.id;

http://sqlfiddle.com/#!9/b232e/13