MySQL:从一个表中选择最小值,从另一个表中选择国家详细信息,并根据国家代码将它们分组



我的数据库中有两个表:

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(可以更改),但它通常适用于真实世界的数据

最新更新