根据其他表值选择GROUP BY的ID

时间:2013-06-24 14:45:32

标签: mysql sql

我有以下表格

produtos

|id(pk), nome|
==============
|27      Oats|
|183     Oats|
|190     Gold|
|25      Gold|

representantes_precos

|id(pk),idproduto(fk),preco|
============================
|1      183           13.00|
|2      190           10.00|
|3      25            15.00|

当我使用此查询时

SELECT   ID, NOME
FROM     ( SELECT * FROM produtos) hey
GROUP BY NOME
HAVING   ( COUNT(NOME) > 0 )

我得到以下结果:

|id, nome|
==========
|190 Gold|
|27  Oats|

但我需要的是:

|id, nome|
==========
|190 Gold|
|183 Oats|

我希望Group By的ID是representantes_precos表上具有最高值的ID。我尝试了coalesce和sub-choices,join和其他东西,但没有成功。

非常感谢任何帮助。

Ps:抱歉我的英语很差。

2 个答案:

答案 0 :(得分:1)

使用MAX()查找最大的id(按nome分组时),然后找到与id匹配的行:

SELECT id, nome
FROM produtos p
WHERE id IN (
  SELECT COALESCE(MAX(rp.idproduto), MAX(p.id))
  FROM produtos p
  LEFT JOIN representantes_precos rp ON p.id = rp.idproduto
  GROUP BY p.nome)

使用SQLFiddle here。注意LEFT JOIN允许p没有相应rp的记录,并使用COALESCE()首先在rp表中找到MAX,然后{如果找不到{1}}表。

尝试在非不同列上进行GROUP,然后在SELECT子句中包含其他非分组列(在您的情况下为p),则会遇到麻烦。为什么MySQL允许这种情况,然后返回不可预测的结果超出了我的范围。

答案 1 :(得分:0)

SELECT   ID, NOME
FROM     ( SELECT p.ID,p.Nome,r.preco FROM produtos p
          left join representantes_precos r
          on p.id=r.idproduto order by preco desc) test
GROUP BY NOME;

fiddle