2015-09-18 73 views
0

我有3個表:MAX函數返回行

Proveedor

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

單方面

+-----+-----------+-------+ 
| 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 | 
+-----+-----+-------+ 

我試圖得到「的‘單方面’的ID與名稱=‘P1’的用戶(部分)具有最高‘costo’(成本)」

我的查詢是這樣的一種:

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 | 
+-----+------------+ 

,我只SPECT得到1排它必須

+-----+------------+ 
| 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

您是否意識到成本150的平局? –

+0

順便說一句,使用'內部連接'作爲gordon回答intent' IN'性能更好# –

回答

1

的問題MAX是不會帶來有關該值的行。因爲像這種情況,MAX值可以匹配多行。

這就是爲什麼在Gordon解決方案中,您將成本進行排序並獲得最高價值的成本。但在這種情況下,你失去了聯繫。

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"; 
+0

非常感謝! ! –

+0

因此,對於'MAX()'是更好地使用它,當不涉及多個值,如在這個例子中的權利? –

+0

當您使用「group by」例如獲取每個被證明者的最大值時,MAX() –

3

如果你正在學習SQL,我勸你學習明確的join語法。此外,還可以通過使用order bylimit獲得的最大成本一排 - 不需要聚合函數:

select c.pid, c.costo 
from catalogo c join 
    proveedor p 
    on c.sid = p.sid 
where p.pnombre = 'P1' 
order by c.cost desc 
limit 1; 
+0

謝謝,我忘了說我已經用「order by」解決了(我剛剛編輯了我的問題) –