使用MySql选择行的子集:有条件地限制所选条目的数量
这是我上一个问题的后续问题。我希望在以下情况下发布新问题是合适的: 我有一个如下所示的sql表(例如): 我想为每个卖家选择一行:特别是,对于每个卖家,我想选择价格最便宜、金额最大的一行。在上面的例子中,我想要第2行和第5行(或者第3行和第5行,只要我只得到其中一行,我不在乎得到第2行和第3行中的哪一行) 我用的是:使用MySql选择行的子集:有条件地限制所选条目的数量,mysql,sql,Mysql,Sql,这是我上一个问题的后续问题。我希望在以下情况下发布新问题是合适的: 我有一个如下所示的sql表(例如): 我想为每个卖家选择一行:特别是,对于每个卖家,我想选择价格最便宜、金额最大的一行。在上面的例子中,我想要第2行和第5行(或者第3行和第5行,只要我只得到其中一行,我不在乎得到第2行和第3行中的哪一行) 我用的是: dbquery("SELECT a.* FROM $marketdb a INNER JOIN ( SELECT sell
dbquery("SELECT a.* FROM $marketdb a
INNER JOIN
(
SELECT seller, MAX(amount) amount
FROM $marketdb
WHERE price=$minprice
GROUP BY seller
) b ON a.seller = b.seller AND
a.amount = b.amount;");
但这给了我第2、3和5行,我只想要第2和3行中的一行
我还一直怀疑这可能也不会总是返回最低价格行。到目前为止,我的测试一直被一个事实所迷惑,即我得到的不止一行,与给定卖家输入的金额相同
如果有人能指出我的错误,我将不胜感激
谢谢
编辑:对不起,我没有问我想问什么。我希望从全局最小价格返回行,每个卖家最多1行,而不是每个卖家的最小价格。这将只是上面的第2行或第3行。对不起 只要试着在卖家上添加另一个groupby,因为您想要卖家的单行 到最后的查询像
SELECT a.* FROM $marketdb a
INNER JOIN
(
SELECT seller, MAX(amount) amount
FROM $marketdb
WHERE price=$minprice
GROUP BY seller
)
b ON a.seller = b.seller AND
a.amount = b.amount group by a.seller;
只需尝试在卖家上添加另一个group by,因为您希望卖家为单行 到最后的查询像
SELECT a.* FROM $marketdb a
INNER JOIN
(
SELECT seller, MAX(amount) amount
FROM $marketdb
WHERE price=$minprice
GROUP BY seller
)
b ON a.seller = b.seller AND
a.amount = b.amount group by a.seller;
您可能需要按联接外部的卖方列进行分组。此外,您的
WHERE
子句看起来像是WHERE price是一个设定的数字,而不是,您可能需要在联接之外按卖家列进行分组。另外,您的WHERE
子句看起来像WHERE price是一个固定的数字,而不是测试这个SQL fiddle:
有点。。。工作:)测试此SQL FIDLE:
有点。。。工作:)这个答案的结尾有一个难看的漏洞,但是如果你不在乎返回哪一行,那么我想它可以节省一些输入。尽管如此,如果您真的不关心返回哪一行,这往往会指向模式设计中更根本的缺陷
SELECT x.*
FROM market x
JOIN
( SELECT seller,MIN(price) min_price FROM market GROUP BY seller) y
ON y.seller = x.seller
AND y.min_price = x.price
JOIN
( SELECT seller,price,MAX(amount) max_amount FROM market GROUP BY seller,price) z
ON z.seller = y.seller
AND y.min_price = z.price
AND z.max_amount = x.amount
GROUP
BY seller;
另一种方法,我不喜欢,但在这里很受欢迎,是这样的
SELECT x.*
FROM
( SELECT *
FROM market
ORDER
BY seller
, price
, amount DESC
, id
) x
GROUP
BY seller;
在这个答案的末尾有一个难看的漏洞,但是如果你不在乎返回哪一行,那么我想它可以节省一些打字。尽管如此,如果您真的不关心返回哪一行,这往往会指向模式设计中更根本的缺陷
SELECT x.*
FROM market x
JOIN
( SELECT seller,MIN(price) min_price FROM market GROUP BY seller) y
ON y.seller = x.seller
AND y.min_price = x.price
JOIN
( SELECT seller,price,MAX(amount) max_amount FROM market GROUP BY seller,price) z
ON z.seller = y.seller
AND y.min_price = z.price
AND z.max_amount = x.amount
GROUP
BY seller;
另一种方法,我不喜欢,但在这里很受欢迎,是这样的
SELECT x.*
FROM
( SELECT *
FROM market
ORDER
BY seller
, price
, amount DESC
, id
) x
GROUP
BY seller;
查询:
SELECT s.*
FROM sellers s
WHERE s.id = (SELECT s2.id
FROM sellers s2
WHERE s2.seller = s.seller
ORDER BY s2.price ASC, s2.amount DESC
LIMIT 1)
结果:
| ID | SELLER | PRICE | AMOUNT |
--------------------------------
| 2 | tom | 350 | 750 |
| 5 | jerry | 500 | 1000 |
查询:
SELECT s.*
FROM sellers s
WHERE s.id = (SELECT s2.id
FROM sellers s2
WHERE s2.seller = s.seller
ORDER BY s2.price ASC, s2.amount DESC
LIMIT 1)
结果:
| ID | SELLER | PRICE | AMOUNT |
--------------------------------
| 2 | tom | 350 | 750 |
| 5 | jerry | 500 | 1000 |
您的第一个查询几乎完全符合我的要求。我现在意识到我把问题的措辞弄错了。你的询问完全符合我在OP中的要求,但我所问的并不是我想要的。改变是我只希望卖家返回全局最小值的行,而不是每个卖家的最小值。所以我实际上从OP中的示例中得到的只是第2行或第3行。我道歉。我正在尝试修改您的示例,结果不一:)您的第一个查询几乎完全符合我的要求。我现在意识到我把问题的措辞弄错了。你的询问完全符合我在OP中的要求,但我所问的并不是我想要的。改变是我只希望卖家返回全局最小值的行,而不是每个卖家的最小值。所以我实际上从OP中的示例中得到的只是第2行或第3行。我道歉。我试图修改你的例子,正如我们所说,结果喜忧参半:)这样做了,非常小的修改,以适应我的粗心(见编辑)。谢谢这就做到了,用非常小的mod来适应我的粗心(参见编辑)。谢谢非常感谢您向我介绍SQL fiddle的使用!非常有帮助!非常感谢您向我介绍SQL fiddle的使用!非常有帮助!