使用MySql选择行的子集:有条件地限制所选条目的数量

使用MySql选择行的子集:有条件地限制所选条目的数量,mysql,sql,Mysql,Sql,这是我上一个问题的后续问题。我希望在以下情况下发布新问题是合适的: 我有一个如下所示的sql表(例如): 我想为每个卖家选择一行:特别是,对于每个卖家,我想选择价格最便宜、金额最大的一行。在上面的例子中,我想要第2行和第5行(或者第3行和第5行,只要我只得到其中一行,我不在乎得到第2行和第3行中的哪一行) 我用的是: dbquery("SELECT a.* FROM $marketdb a INNER JOIN ( SELECT sell

这是我上一个问题的后续问题。我希望在以下情况下发布新问题是合适的:

我有一个如下所示的sql表(例如):

我想为每个卖家选择一行:特别是,对于每个卖家,我想选择价格最便宜、金额最大的一行。在上面的例子中,我想要第2行和第5行(或者第3行和第5行,只要我只得到其中一行,我不在乎得到第2行和第3行中的哪一行)

我用的是:

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的使用!非常有帮助!