0

左の結合部分でデータまたは null を返すクエリがあります。ただし、既存のレコードがある場合でも、データは返されません。左結合部分のひねりは、存在する場合に 1 つのレコードのみを取得したいということです。助けてくれてありがとう。

select a.*,p.thumbnailphotopath as AlbumPicture 
from (select * from album_access) ac
inner join (select * from albums) a on a.ID = ac.AlbumID
left join (
    select * from photos 
    where IsProcessed = 1 order by DateUploaded desc limit 1
) p 
on a.ID = p.AlbumID #should return one if exist.
where ac.AccessUserID = '35e44a8e-643a-4c4f-8a46-59911a1e7c53' 
  and ac.FullControl = 1 and a.Private = 1
4

1 に答える 1

2

まず、テーブル名だけで結合でき、SELECT * FROM ステートメント全体で結合する必要はありません。

次に、SELECT * を使用せず、代わりに必要な列を SELECT する必要があります。

しかし、LEFT JOIN の問題は、1 つの結果のみを返すサブクエリに参加していることだと思います。これは、属しているアルバム ID に関係なく、最後にアップロードされた写真のエントリになります。各行の最終アップロード日を含む写真のエントリが必要な場合は、次のようなものを試してください

SELECT a.*,p.thumbnailphotopath AS AlbumPicture 
FROM album_access ac
INNER JOIN albums a ON a.ID = ac.AlbumID
LEFT JOIN (
    SELECT albumID,MAX(DateUploaded) FROM photos 
    WHERE IsProcessed = 1 GROUP BY albumID
) p ON a.ID = p.AlbumID #should return one if exist.
WHERE ac.AccessUserID = '35e44a8e-643a-4c4f-8a46-59911a1e7c53' 
  AND ac.FullControl = 1 
  AND a.Private = 1
于 2012-04-19T18:51:13.627 に答える