1

ユーザー、プロジェクト、ファイルの 3 つのテーブルがあります。関連する列は次のとおりです。

users:    [userid](int)

projects: [userid](int) [projectid](int) [modified](datetime)

files:    [userid](int) [projectid](int) [fileid](int) [filecreated](datetime)

クエリを使用してすべてのプロジェクトを一覧表示していますが、別のテーブルの最新のファイルも含めたいと考えています。これに対する私のアプローチは、サブクエリを使用して結合することでした。

これが私が思いついたものですが、私の問題は、最も古いファイルを返すことです:

SELECT * FROM projects
INNER JOIN users ON projects.userid = users.userid
JOIN (SELECT filename,projectid FROM files
      GROUP BY files.projectid
      ORDER BY filecreated DESC) AS f
ON projects.projectid = f.projectid
ORDER BY modified DESC

ORDER BY filecreated DESC がこれを解決すると思いますが、完全に無視されているようです。

私はSQLにかなり慣れていませんが、おそらくこれに正しい方法でアプローチしていませんか?

4

2 に答える 2

3

あなたの問題はあなたのサブクエリにあります:

(SELECT filename,projectid FROM files
      GROUP BY files.projectid
      ORDER BY filecreated DESC) AS f

この種のグループ化された列とグループ化されていない列を混合して使用しているため、MySQL を使用していると思います。句は、ORDER BY句を適用した後は効果GROUP BYがないことに注意してください。MySQL がそのような構文を許可しているという事実に依存することはできません (通常、通常の SQL では、これはまったく不適切なクエリです)。

これを修正するには、サブクエリで適切な形式のレコードを取得する必要があります。たとえば、次のようにします。

SELECT
  files.filename,
  files.projectid
FROM
  (SELECT  
    MAX(filecreated) AS max_date, 
    projectid 
  FROM 
    files 
  GROUP BY 
    projectid) AS files_dates
  LEFT JOIN
    files 
      ON files_dates.max_date=files.filecreated AND files_dates.projectid=files.projectid
于 2013-08-28T07:46:54.460 に答える
1

最新のファイルとそれを作成したユーザーを含むプロジェクトのリストが必要だと思います。

SELECT projects.projectid, f.username, f.filename, f.filecreated
FROM projects
LEFT OUTER JOIN (
    SELECT TOP 1 username, filename, filecreated
    FROM files
    INNER JOIN users ON users.userid = files.userid
    ORDER BY filecreated DESC
) AS f ON projects.projectid = f.projectid
ORDER BY modified DESC
于 2013-08-28T07:46:05.980 に答える