MAX函数返回一行

时间:2015-09-18 15:12:46

标签: mysql sql

我有3张桌子:

Proveedor

+-----+---------+-----------+
| sid | pnombre | direccion |
+-----+---------+-----------+
|   1 | P1      | La Paz    |
|   2 | Paco    | 31 Pte    |
|   3 | Pepe    | 31 Pte    |
+-----+---------+-----------+

PARTE

+-----+-----------+-------+
| pid | pnombre   | color |
+-----+-----------+-------+
|   1 | Palanca 1 | Gris  |
|   2 | Palanca 2 | Gris  |
|   3 | Palanca 3 | Verde |
|   4 | Palanca 4 | azul  |
+-----+-----------+-------+

Catalogo

+-----+-----+-------+
| sid | pid | costo |
+-----+-----+-------+
|   1 |   1 |   100 |
|   1 |   2 |   120 |
|   2 |   3 |    90 |
|   1 |   3 |   150 |
|   1 |   4 |   150 |
+-----+-----+-------+

我正在尝试使用姓名为'P1'的用户的最高'costo'(成本)来获得'parte'(部分)的ID“

我的查询就是这个:

SELECT pid, MAX(costo)
FROM catalogo
WHERE sid IN(SELECT sid
             FROM proveedor
             WHERE pnombre = "P1")
GROUP BY pid;

但我的结果是:

+-----+------------+
| pid | MAX(costo) |
+-----+------------+
|   1 |        100 |
|   2 |        120 |
|   3 |        150 |
|   4 |        150 |
+-----+------------+

我只能得到一排必须

+-----+------------+
| pid | MAX(costo) |
+-----+------------+
|   3 |        150 |
+-----+------------+

所以问题是,我的查询错误是什么?如何使用MAX()返回1行?

注意: 我已经用另一个查询解决了这个问题 但 我正在尝试理解MAX()的工作原理

查询(2)解决没有MAX():

SELECT pid, costo 
FROM catalogo 
WHERE sid IN (SELECT sid 
              FROM proveedor 
              WHERE pnombre = "P1")  
ORDER BY costo DESC 
LIMIT 1;

2 个答案:

答案 0 :(得分:3)

如果您正在学习SQL,我建议您学习明确的m = do.call(function(...) paste(...,sep="_"), as.data.frame(M)) 语法。此外,您可以使用joinorder by获得最高费用的行 - 不需要聚合函数:

limit

答案 1 :(得分:1)

MAX的问题并未导致与该值相关的行。因为像这种情况,MAX值可以匹配多行。

这就是为什么在戈登解决方案中,您可以对成本进行排序并获得最高价值的成本。但在那种情况下,你失去了联系。

<强> SQL Fiddle Demo

在此解决方案中,

  • 您首先计算最大值
  • 然后带来与该值匹配的所有记录
  • 最后选择属于P1
  • 的那个

  SELECT pid, c.costo
  FROM
  (
    SELECT MAX(costo) costo
    FROM proveedor p
    INNER JOIN Catalogo c
       ON p.sid = c.sid
    WHERE p.pnombre = "P1"
   ) mcosto
   inner join Catalogo c
    on mcosto.costo = c.costo
   inner join proveedor p
    on p.sid = c.sid
   WHERE p.pnombre = "P1";