0

タイムスタンプフィールド「bar」を持つテーブル「foo」があります。fooからSELECTfoo.barのようなクエリの最も古いタイムスタンプのみを取得するにはどうすればよいですか?fooからSELECTMIN(foo.bar)のようなことをしようとしましたが、このエラーで失敗しました

1行目のエラー1140(42000):GROUP BY句がない場合、GROUP列(MIN()、MAX()、COUNT()、...)とGROUP列の混合は無効です。

OK、それで私のクエリはそれよりもはるかに複雑で、それが私がそれに苦労している理由です。これは、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
;

現在実行中です。

4

1 に答える 1

1

集約関数 (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

それを取得するには、次のクエリを使用できます...データをグループ化し、何かの min() を取得する方法をデータベースに指示する group by 句に注意してください。

select
    transaction,
    min(date)
from
    table
group by
    transaction
于 2009-08-06T19:14:32.850 に答える