2013-06-24 5 views
1

У меня есть следующие таблицыВыбор идентификатора GROUP BY на основе другого значения таблицы

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| 

Я хочу, чтобы идентификатор группы By тот, кто имеет наибольшее значение на representantes_precos столе , Я пробовал объединиться и подбирать, присоединяться и другие вещи, но не имел успеха.

Любая помощь будет принята с благодарностью.

Пс .: Извините за мой бедный английский.

+1

Вам не нужно ИМЕТЬ заявление, если ваш счетчик больше 0, потому что все, что будет означать, что она существует. Затем сделайте ниже ответ с MAX, и он должен помочь. –

ответ

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(), чтобы сначала найти MAX в таблице rp, а затем таблицу p, если она не найдена.

Попытка GROUP нечеткого столбца, а затем включение других негруппированных столбцов в ваш оператор SELECT (id в вашем случае), запрашивает проблемы. Почему MySQL разрешает это, а затем возвращает непредсказуемые результаты, вне меня.

+0

Это работает. Благодарю. Но есть ли способ сделать так, чтобы все регистры возвращались в таблицу produtos, даже если у них нет корреспондента в таблице Representantes_precos? – Ahdriel

+0

@ user2516656: Если у них нет соответствующей записи в таблице Representantes_precos, какое значение должно быть возвращено - все равно самый большой идентификатор? – PinnyM

+0

Если у них нет соответствующей записи, любой идентификатор может быть возвращен, но если у них есть только одна соответствующая запись, идентификатор этой записи должен быть возвращен. – Ahdriel

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

+0

Это не возвращает желаемые результаты, проверьте свою скрипку. Он возвращает самый низкий идентификатор, а не самый высокий. И он также вызывает «ID» после группировки «НЕОМ» - поведение для такого запроса _unpredictable_ и не должно использоваться. – PinnyM