Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2011, 08:35   #1
mrgrudge
Форумчанин
 
Аватар для mrgrudge
 
Регистрация: 20.02.2010
Сообщений: 229
По умолчанию MAX \ MIN sql реакции

Доброго времени суток.
Столкнулся с такой вот проблемой,
есть таблица с несколькими полями, одно из них айди с другой таблицы, другое юникс время, другое мыло.
В запросе нужно выбрать айди юзера где время самое маленькое, т.е. юзера который самый первый выслал письмо на мыло
вот запрос
SELECT MIN(dateinvite), user_id FROM myfriend WHERE mail ='kon@mail.ru'
по логике вещей все верно, он как надо выдает нужную запись (их сделано 3 для тестов)

НО, поменяв MIN на MAX я получил точно такой же результат, что и натолкнуло меня на мысль что что-то в моем запросе не верно.

хотя записи по времени явно отличаются

dateinvite | user_id | mail
____________________________
1310616566 | 9895 | kon@mail.ru
1310616747 | 1001 | kon@mail.ru
1310616793 | 1002 | kon@mail.ru

и не важно что я пишу MIN или MAX мне выдает : dateinvite - 1310616566 user_id - 9895

кто-то сталкивался с подобным??
думай как баг, действуй как баг, и ты найдешь баг )
mrgrudge вне форума Ответить с цитированием
Старый 14.07.2011, 09:20   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

MIN, MAX функции, используемые в операторах GROUP BY.
Если нет GROUP BY, то ф-я примет на входе 1 первое значение из полученных по WHERE строк.

ORDER, LIMIT - используйте
Код:
SELECT dateinvite, user_id FROM myfriend WHERE mail ='kon@mail.ru' ORDER BY  dateinvite LIMIT 1
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 14.07.2011, 09:25   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

у вас принципиально НЕВЕРНЫЙ запрос.

Нормальные СУБД (MS SQL, Oracle) будут ругаться на такой запрос.
и примерно такими словами:
попытка использовать в запросе поле user_id, которое не указано в конструкции GROUP BY

но, если Вы добавите поле user_id в группировку, Вы получите минимальную (максимальную) дату по каждому пользователю отдельно!

Задачу можно решить так:
первый вариант.
не помню, как там с поддержкой вложенных запросов в MySQL
вроде бы должны быть.
Код:
select user_id from myfriend 
  where  
    dateinvite in 
        (SELECT MIN(My2.dateinvite) FROM myfriend My2 WHERE My2.mail ='kon@mail.ru')
    and 
        mail ='kon@mail.ru'

учтите, что, теоретически, может вернуться НЕСКОЛЬКО user_id (если у нескольких одинаковое минимальное (максимальное) dateinvite
при желании с этим легко побороться. ну, например, брать MIN(user_id) или MAX(user_id) или ограничить выборку через LIMIT ...


______________

ДОБАВЛЕНО

mv28jam, согласен, Ваш вариант запроса проще и эффективнее!!

Последний раз редактировалось Serge_Bliznykov; 14.07.2011 в 09:28.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.07.2011, 10:05   #4
mrgrudge
Форумчанин
 
Аватар для mrgrudge
 
Регистрация: 20.02.2010
Сообщений: 229
По умолчанию

Serge_Bliznykovспасибоо, запрос работает на ура.
А по поводу одинаковых значений в dateinvate я сомневаюсь что 2 и более челов в одну и ту же секунду жмакнут по кнопке, и у них одинаково быстро отработаются скрипты)
думай как баг, действуй как баг, и ты найдешь баг )
mrgrudge вне форума Ответить с цитированием
Старый 14.07.2011, 10:20   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пожалуйста.

кстати, mrgrudge, можете смело брать запрос mv28jam
Он проще и (в общем случае) - эффективнее.

в нём есть нюансик, он всегда вернёт только одного пользователя, даже если таких (с одинаковым временем) - несколько. Но в Вашем случае подобное поведение - это только плюс, а не минус!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
max и min Кристинка89 Общие вопросы C/C++ 2 23.02.2011 15:24
Матрица Min-Max и Max-Min boog Помощь студентам 3 23.12.2010 13:19
MAX, MIN ='MT4'|ASK!....... lite Microsoft Office Excel 7 27.07.2010 16:46
подпрограма(max/min) misha25525 Помощь студентам 2 07.04.2010 19:45
min max Alpha_Dog Фриланс 10 15.03.2010 19:27