我的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
:
答案 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;