我的数据库中有两个表:
1. venprices
+---------+---------+--------+
| concode | rate | vendor |
+---------+---------+--------+
| 1234 | 1.23402 | a |
| 1234 | 1.5692 | b |
| 1234 | 1.114 | c |
| 1234 | 1.4 | d |
| 1122 | 1.46 | a |
| 1122 | 1.5 | c |
| 1122 | 1.2 | d |
+---------+---------+--------+
2. country
+-------+---------+
| conid | conname |
+-------+---------+
| 1122 | con2 |
| 1234 | con1 |
+-------+---------+
我想要这样的输出:
+---------+---------+-------------+--------+
| concode | conname | MIN(v.rate) | vendor |
+---------+---------+-------------+--------+
| 1122 | con2 | 1.2 | d |
| 1234 | con1 | 1.114 | c |
+---------+---------+-------------+--------+
I am Using Query: SELECT v.concode,c.conname, MIN(v.rate), v.vendor FROM venprices v, country c WHERE c.conid = v.concode GROUP BY c.conid;
查询给出结果,但供应商名称错误。而不是提供相对供应商的价格,它总是在结果中给我供应商的a
。
我试过不同的子句和子查询,但它在静脉。有人能告诉我实际的问题和查询产生预期的结果吗?
可以使用子查询
select v.concode,c.conname, v.rate, v.vendor
FROM venprices v
inner join country c on c.conid = v.concode
where (v.concode, v.rate) in ( select v.concode, min(v.rate)
from venprices v
group by v.concode)
如果'conid'与'concode'不相关,则可以使用LEFT JOIN
select v.concode,c.conname, v.rate, v.vendor
FROM venprices v
left join country c on c.conid = v.concode
where (v.concode, v.rate) in ( select v.concode, min(v.rate)
from venprices v
group by v.concode)
首先,不要在FROM
子句中使用逗号。始终在ON
子句中使用显式JOIN
语法和连接条件。
有几种方法可以达到你的目的。一个技巧使用substring_index()
和group_concat()
:
SELECT c.conid, c.conname,
MIN(v.rate),
SUBSTRING_INDEX(GROUP_CONCAT(v.vendor ORDER BY v.rate ASC), ',', 1) as vendor
FROM venprices v JOIN
country c
ON c.conid = v.concode
GROUP BY c.conid;
这并不是在所有情况下都有效——group_concat()
的中间字符串长度为1024(可以更改),但它通常适用于真实世界的数据