2012-06-21 7 views
2

почему дает этот запрос странные результаты ..запросов SQL дает странные результаты

SELECT max(greatest(home_team_total,away_team_total)) AS max_team_score, id 
FROM `match` 
WHERE id IN (1,2,3,4,5) 

в то время как

SELECT greatest(home_team_total,away_team_total) AS max_team_score, id 
FROM `match` 
WHERE id IN (1,2,3,4,5) 
ORDER BY max_team_score DESC 
LIMIT 1 

дает правильный результат ..

Максимальное значение правильно только в обоих случаев, но идентификатор совпадения неверен в первом случае.

ответ

3

Это потому, что вы включаете поле id в предложение SELECT. Какой идентификатор вы хотите? Я понимаю, что вам может понадобиться связанная с максимальной строкой, но может быть несколько, и что, если вы также возвращаете min(greatest(home_team_total,away_team_total))?

Второй запрос - это тот, который вы хотите для этой проблемы.

Редактирование, чтобы сделать его немного понятнее:

Ваш запрос эквивалентен:

SELECT max(greatest(home_team_total,away_team_total)) AS max_team_score, ANY(id) 
FROM `match` 
WHERE id IN (1,2,3,4,5) 

Посмотрите на http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

Он говорит: «Сервер волен выбрать любой значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными ».

+0

Ну, как я упоминал в вопросе, я хочу, чтобы строка из таблицы соответствия соответствовала максимальному количеству баллов ... и мне никогда не понадобится minmum..и не существует нескольких строк за это время ... и даже если есть более одного, он может вернуть любой из них Мне нужно только это для статистики .. –

+0

Я получаю именно то, что вы хотите, но притворяйтесь, что я играю роль сервера. Он не знает ответов на эти вопросы. –

+0

весь вопрос, почему первый запрос неправильный ... технически ?? –

0

Если вы хотите, чтобы первый запрос на работу, вы должны изменить его на что-то вроде следующего:

ВЫБРАТЬ наибольшее (home_team_total, away_team_total) AS max_team_score, идентификатор FROM match WHERE наибольшее (home_team_total, away_team_total) = ( SELECT MAX (наибольшее (home_team_total, away_team_total)) FROM match )

Обратите внимание, что вы можете иметь более чем одну строку в результате, поэтому я предпочел бы это решение на "LIMIT 1" Альтер ческие.

+0

сначала..Y ??? и во-вторых, проблема в том, что есть несколько результатов. В любом случае мне нужен только один результат .. это будет любой из них. –

+0

Подумайте о случае, когда есть гонка, и она заканчивается галстуком.У вас были бы победители, разделившие место на подиуме, вместо того, чтобы вручать приз только одному из победителей. Однако, если ваше решение работает только с отображением одной из строк, вы можете использовать запрос, опубликованный ранее, или добавить LIMIT 1 к этому запросу (или использовать первый результат и отбросить оставшиеся результаты через ваше приложение). –

Смежные вопросы