我有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;
答案 0 :(得分:3)
如果您正在学习SQL,我建议您学习明确的m = do.call(function(...) paste(...,sep="_"), as.data.frame(M))
语法。此外,您可以使用join
和order 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";