2015-01-19 2 views
-2

Я давно испортил этот код. Во-первых, у меня есть настройка таблицы SQL как char вместо десятичной, потому что я не хочу, чтобы число всегда показывало десятичное значение, если оно не имеет десятичного значения (есть ли другой способ сделать это?). Я меняю его на десятичный код в моем коде, но я считаю, что в этом проблема. Я пытаюсь вытащить самую большую рыбу за каждого человека, но она не работает.mySQL Наибольшее количество по группам

SELECT * FROM (SELECT * FROM entries ORDER BY CAST(weight AS DECIMAL(9,3)) DESC) tmp WHERE username = :user GROUP BY species 

EDIT

я изменил свою таблицу, чтобы использовать десятичный (10,3), а не полукокс и пытаюсь этой формуле

SELECT * FROM (SELECT * FROM entries ORDER BY CAST(weight AS INT) DESC) tmp WHERE username = 'BooF' GROUP BY species 

Но по какой-то причине он возвращает этот

username location  species date length weight timestamp id 
BooF Muskellunge Lake Black Crappie 2014-08-31 9.125 0.37 2014-12-20 10:48:06 13 
BooF Black Lake Largemouth Bass 2014-07-03 16.75 2.62 2014-12-20 10:49:00 2 
BooF Muskellunge Lake Northern Pike 2014-08-31 32.75 6.86 2014-12-20 10:49:37 14 
BooF Lake Bonaparte Rock Bass 2014-09-27 7 0.30 2014-12-20 10:50:50 57 
BooF Lake Ozonia Smallmouth Bass 2014-08-15 13 1.19 2014-12-20 10:51:14 1 
BooF Stark Falls Reservoir Walleye 2014-08-15 16 0.97 2014-12-20 10:51:37 49 
BooF Lake Bonaparte Yellow Perch 2014-09-27 8.5 0.40 2014-12-20 10:52:01 56 

Это таблица, в которой я работаю с

username location  species  date  length weight timestamp id 
BooF Lake Ozonia Smallmouth Bass 2014-08-15 13.000 1.190 2014-12-20 10:51:14 1 
BooF Black Lake Largemouth Bass 2014-07-03 16.750 2.620 2014-12-20 10:49:00 2 
BooF Muskellunge Lake Largemouth Bass 2014-08-31 12.000 1.000 2014-08-31 22:04:42 7 
BooF Muskellunge Lake Largemouth Bass 2014-08-31 16.000 2.000 2014-08-31 22:04:42 8 
BooF Muskellunge Lake Largemouth Bass 2014-08-31 14.000 1.000 2014-08-31 22:04:42 9 
BooF Muskellunge Lake Largemouth Bass 2014-08-31 16.000 2.000 2014-08-31 22:04:42 10 
BooF Muskellunge Lake Largemouth Bass 2014-08-31 14.000 2.000 2014-08-31 22:04:42 11 
BooF Muskellunge Lake Largemouth Bass 2014-08-31 16.000 2.000 2014-08-31 22:05:53 12 
BooF Muskellunge Lake Black Crappie 2014-08-31 9.125 0.370 2014-12-20 10:48:06 13 
BooF Muskellunge Lake Northern Pike 2014-08-31 32.750 6.860 2014-12-20 10:49:37 14 
BooF Narrow Lake Northern Pike 2014-03-15 20.000 2.000 2014-09-01 11:08:21 15 
BooF Narrow Lake Largemouth Bass 2014-03-15 14.000 1.000 2014-09-01 11:08:21 16 
BooF Butterfield Lake Largemouth Bass 2014-05-26 19.000 3.000 2014-09-01 11:08:21 17 
BooF Butterfield Lake Largemouth Bass 2014-05-26 17.000 2.000 2014-09-01 11:08:21 18 
BooF Red Lake Northern Pike 2014-06-21 22.000 2.000 2014-09-01 11:08:21 19 
BooF Black Lake Largemouth Bass 2014-07-03 15.000 2.000 2014-09-01 11:12:08 20 
BooF Black Lake Largemouth Bass 2014-07-03 15.000 2.000 2014-09-01 11:12:08 21 
BooF Black Lake Largemouth Bass 2014-07-02 17.000 2.000 2014-09-01 11:12:08 22 
BooF Black Lake Largemouth Bass 2014-07-01 15.000 2.000 2014-09-01 11:12:08 23 
BooF Black Lake Largemouth Bass 2014-07-01 15.000 2.000 2014-09-01 11:12:08 24 
BooF Black Lake Largemouth Bass 2014-06-30 19.250 4.100 2014-12-20 10:53:17 25 
BooF Black Lake Northern Pike 2014-06-29 26.750 3.940 2014-12-20 10:52:38 26 
BooF Stark Falls Reservoir Walleye 2014-08-15 16.000 0.970 2014-12-20 10:51:37 49 
BooF Lake Bonaparte Yellow Perch 2014-09-27 8.500 0.400 2014-12-20 10:52:01 56 
BooF Lake Bonaparte Rock Bass 2014-09-27 7.000 0.300 2014-12-20 10:50:50 57 

Как вы можете видеть после запроса, он публикует бас-гитарный окунь для черного озера весом 2,62 фунта, но в моем листе данных он показывает самый большой бас в 4.1, поэтому я здесь застрял.

+1

Если вы хотите, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

+1

Возможно, что-то вроде ... http://stackoverflow.com/questions/8537037/cast-decimal-to- int – xQbert

+0

Используйте правильные типы данных при хранении данных. (Если вам нужна другая презентация, используйте представление для этой цели.) – jarlh

ответ

1

В общем ORDER BY в подзапросе нет смысла. (Это происходит только в сочетании с FETCH FIRST/LIMIT/TOP и т. Д.)

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

SELECT * 
FROM entries e1 
WHERE username = :user 
    AND CAST(weight AS DECIMAL(9,3)) = (select max(CAST(weight AS DECIMAL(9,3))) 
             from entries e2 
             where e1.username = e2.username 
             and e1.location = e2.location 
             and e1.species = e2.species) 

Обратите внимание, что символ веса по-прежнему является плохим выбором, потому что при сравнении значений вы должны использовать обе стороны. Вернитесь к десятичной цифре в свой стол!

+0

Спасибо за ответ. Я добавил GROUP BY видов в конце этого, и он возвращает результаты, но все еще не возвращает самую тяжелую рыбу. Кажется, он возвращает первый вид, к которому он относится. – Damon

+0

Я думаю, что я понял это, я могу манипулировать тем, что получаю, изменяя whats в предложении where, но я думаю, что я не понимаю, что он делает. – Damon

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