Помощь по конкретному запросу MySQL: как получить наименьшее значение из группы из нескольких значений - PullRequest
0 голосов
/ 06 августа 2009

У меня есть таблица 'foo' с полем отметки времени 'bar'. Как получить только самую старую временную метку для запроса, например: SELECT foo.bar from foo? Я пытался сделать что-то вроде: SELECT MIN (foo.bar) из foo, но это не удалось с этой ошибкой

ОШИБКА 1140 (42000) в строке 1: Смешивание столбцов GROUP (MIN (), MAX (), COUNT (), ...) без столбцов GROUP недопустимо, если отсутствует предложение GROUP BY

Хорошо, мой запрос намного сложнее, и поэтому мне трудно с ним справиться. Это запрос с MIN (a.timestamp):

select distinct a.user_id as 'User ID',
       a.project_id as 'Remix Project Id',
       prjs.based_on_pid as 'Original Project ID',
       (case when f.reasons is NULL then 'N' else 'Y' end)
         as 'Flagged Y or N',
       f.reasons, f.timestamp, MIN(a.timestamp) 
from view_stats a
     join (select id, based_on_pid, user_id
                    from projects p) prjs on
     (a.project_id = prjs.id)
     left outer join flaggers f on
     (    f.project_id = a.project_id
      and f.user_id = a.user_id)
where a.project_id in
(select distinct b.id
   from projects b
  where b.based_on_pid in
                ( select distinct c.id
                    from projects c
                   where c.user_id = a.user_id
                )
)
order by f.reasons desc, a.user_id, a.project_id;

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

Таблица view_stats:

+------------+------------------+------+-----+-------------------+----------------+
| Field      | Type             | Null | Key | Default           | Extra          |
+------------+------------------+------+-----+-------------------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL              | auto_increment | 
| user_id    | int(10) unsigned | NO   | MUL | 0                 |                | 
| project_id | int(10) unsigned | NO   | MUL | 0                 |                | 
| ipaddress  | bigint(20)       | YES  | MUL | NULL              |                | 
| timestamp  | timestamp        | NO   |     | CURRENT_TIMESTAMP |                | 
+------------+------------------+------+-----+-------------------+----------------+

Обновление

Based on thomas' suggestion I converted my query to:
select distinct a.user_id as 'User ID',
       a.project_id as 'Remix Project Id',
       prjs.based_on_pid as 'Original Project ID',
       (case when f.reasons is NULL then 'N' else 'Y' end)
         as 'Flagged Y or N',
       f.reasons, f.timestamp, min(a.timestamp)
from view_stats a
     join (select id, based_on_pid, user_id
                    from projects p) prjs on
     (a.project_id = prjs.id)
     left outer join flaggers f on
     (    f.project_id = a.project_id
      and f.user_id = a.user_id)
where a.project_id in
(select distinct b.id
   from projects b
  where b.based_on_pid in
                ( select distinct c.id
                    from projects c
                   where c.user_id = a.user_id
                )
)
group by a.project_id, a.user_id
order by a.timestamp
;

Он сейчас работает.

1 Ответ

1 голос
/ 06 августа 2009

Если вы собираетесь использовать агрегатные функции (например, min (), max (), avg () и т. Д.), Вам необходимо указать базе данных, что именно нужно для принятия min ().

transaction    date
one            8/4/09
one            8/5/09
one            8/6/09
two            8/1/09
two            8/3/09
three          8/4/09

Полагаю, вы хотите следующее.

transaction    date
one            8/4/09
two            8/1/09
three          8/4/09

Затем, чтобы получить это, вы можете использовать следующий запрос ... обратите внимание на предложение group by, которое сообщает базе данных, как группировать данные и получать min () чего-либо.

select
    transaction,
    min(date)
from
    table
group by
    transaction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...