我有一个复杂的(至少对我来说!)SQL问题,我一直试图解决。
我桌子的结构是:
Query: describe shipping_zones
+------------+--------+---------+
| name | type | comment |
+------------+--------+---------+
| key_id | int | |
| carrier | string | |
| origin_zip | int | |
| dest_zip | int | |
| zone | int | |
+------------+--------+---------+
有三种类型的"运营商"
Query: select DISTINCT(carrier) FROM shipping_zones
+---------+
| carrier |
+---------+
| fedex |
| ups |
| usps |
+---------+
Fetched 3 row(s) in 0.42s
我有这个查询,找到每个运营商返回两个区域:
SELECT carrier, zone
FROM shipping_zones
WHERE (origin_zip = 402 OR origin_zip = 950) AND dest_zip = 978;
+---------+------+
| carrier | zone |
+---------+------+
| ups | 4 |
| ups | 7 |
| fedex | 7 |
| fedex | 4 |
| usps | 8 |
| usps | 4 |
+---------+------+
问题是我只想从每个运营商返回最低的号码,而不是两者。我可以使用Min()还是有更好的方法来做它?
感谢您的帮助,感谢您理解SQL的帮助!
答案 0 :(得分:1)
是的,您可以在按运营商分组后在每个运营商上使用Min()功能。分组将基本上“汇总”您要分组的列(在本例中为运营商),您应用的功能(在这种情况下为“Min”):
SELECT carrier, MIN(zone) as min_zone
FROM shipping_zones
WHERE (origin_zip = 402 OR origin_zip = 950)
AND dest_zip = 978
GROUP BY carrier
答案 1 :(得分:1)
听起来你正在寻找聚合函数。但是,无论何时使用聚合函数,都必须告诉数据库引擎如何单独处理所有字段。如果你有一个文本字段,你只想在有重复的地方折叠,你可以使用group by子句。
SELECT carrier, min(zone)
FROM shipping_zones
WHERE (origin_zip = 402 OR origin_zip = 950) AND dest_zip = 978
group by carrier;