2012-02-23 5 views
0

私はMySQLのテーブル(同情最初のポストのためになし写真を)MySQLのクエリをサポートしてください

Team_id,entry_date, entry_time,gridref 
"20","2011-12-14","10:21:00","496218" 
"20","2011-12-14","10:43:02","349217" 
"21","2011-12-14","10:48:00","351213" 
"22","2011-12-14","11:58:00","327216" 
"22","2011-12-14","11:21:00","328214" 
"23","2011-12-14","11:33:00","351210" 
"23","2011-12-14","10:42:11","350210" 
"23","2011-12-14","11:11:00","350208" 
"24","2011-12-14","10:39:00","329209" 
"24","2011-12-14","11:40:00","328211" 
"27","2011-12-14","11:04:31","344226" 
"29","2011-12-14","11:32:58","328208" 

これは、数日間のデータのかなりがあり

SELECT team_id, entry_date, entry_time, gridref 
FROM `tlog` 
WHERE gridref != '' 
    AND team_id != 0 
    AND (entry_date = (SELECT MAX(entry_date) FROM `tlog`)) 
ORDER BY `tlog`.`team_id` ASC 

で取得するためのSQLを持っています各チームのエントリーは、情報の時に必要ではなく、任意の順序で参加することができます(1日後に入力できる場合)。スペースや文字がないため、yyyy-mm-mm hh:mm形式を入力しようとすると問題が発生しました。だから別の日付と時刻のentiesは、この問題を修正しました。

チームに関連していないエントリやグリッドがないエントリもあります。しかし、エントリごとにentry_dateとentry_timeがあります。 entry_dateのMySQL形式はDATEで、entry_timeはTIMEです。

私はシニアの各チームの最後のエントリを取得しようとしています。誰かが私に骨を投げて噛んでください。

+1

をサポートするデータ型に変換する必要があり、このために明らかに例えば

max(entryDate + ' ' + entryTime) 

一緒に使用すると、日付と時刻を連結する必要があるだけで、単一の副問合せをしたい場合'GROUP BY tlog.team_id'を使う必要がありますか? – ArVan

+0

'SELECT * FROM tlog WHERE gridref!= '' AND team_id!= 0 ORDER BY tlog.entry_date DESC GROUP BY tlog.team_id;' – Pateman

+1

「各チームの最後のエントリを取得する」とはどういう意味ですか? – CodeCaster

答えて

0

あなたはその後、サブクエリでチームごとに、その日の最大時間は、その後、チームID、日時に外部クエリに参加し、チームごとの最大の日付を取得する必要があります。

select t.teamid, t.entryDate, t.entryTime, t.gridRef 
from tlog t 
inner join (select t2.teamid, med.ed, max(entryTime) et from tlog t2 
       inner join (select teamid, max(entryDate) ed from tlog where teamid > 0 and gridRef <> '' group by teamid) med on med.teamid = t2.teamid and med.ed = t2.entryDate group by t2.teamid, med.ed) met on met.teamid = t.teamid and met.ed = t.entryDate and met.et = t.entryTime 

構築しようとするにはこのようなクエリは、論理的なステップを実行するだけです。つまり、チームごとに最新の日付が必要です。それを達成するためのクエリを作成します。次に、それぞれの日付の最新の時刻が必要です。次に、それらに一致する詳細を見つける。テンポラリテーブルを使用すると、それを明確にすることができます。

最新の時刻が必ずしも最新の日付であるとは限らないため、max(entryDate)とmax(entryTime)という単一のサブクエリを持つことはできません。

のMySQLでサポートされていると、あなたはたぶん連結

+0

ええと、私は他の人と同じ結果を得ようとしました。私は遊び続けて、どうやって行くのか見ていきます。 – tastech

+0

申し訳ありませんが、重複した日付があることに気付きました。更新されたクエリ – kaj

+0

Aaahhhを持っていますが、今は近づいていますが、team_idを持たないレコードやgridrefを持たないレコードがあります。だから私はteam_idを持たないすべてのレコードをフィルタリングしたい、あるいはgridrefが空であり、team_id> 0でgridrefが空白ではない(!= '')それぞれの最後のレコードのみを表示する。 – tastech

0

たぶん、このようなものは役立つだろう:

SELECT MAX(entry_date) FROM `tlog` WHERE gridref != '' AND team_id != 0 GROUP BY team_id 
+0

これは時間の最後のエントリを与えません。 – tastech

0

をジャスト日時またはint型(タイムスタンプ)欄に日付と時刻を格納します。はい、それはこのようにすることができますが、あなたは利益を得るのではなく、問題を解決します。

これをビューレイヤーで修正します。日付の入力中にユーザーが間違いを犯した場合は、JavaScriptのカレンダーコントロールを使用して、日付と時刻を選択させます。

これが不可能な場合は、strtotime()と一部の文字列連結を使用して入力を解析します。

+0

タイムスタンプに関する問題は、エントリが順序どおりに入力できないため、2〜3日後に入力できるため、この場合タイムスタンプによるソートは機能しません。 – tastech

+0

@ user1227400タイムスタンプ列は、_current_タイムスタンプで埋められる必要はありません。 – CodeCaster

+0

はい、私は知っていますが、特定の管理上の理由から、私は日付/時刻のフィールドを組み合わせることはできません。 – tastech

関連する問題