1

私はこのようなmySQLクエリを使用して、写真について必要な情報の一部を取得します。

SELECT
users.first_name,
users.last_name,
photos.filename,
photos.YEAR,
photos.description,
themes.name AS theme_name

FROM
`photos`,
`users`,
`themes`

WHERE
users.facebook_id = photos.author AND
themes.id = photos.theme AND
photos.id = 35

LIMIT 1;

このクエリでもう1つのデータを「SELECT」したいと思います。「bookmarked」は、次のクエリに正確に1行ある場合にTRUEの値を持ちます。

SELECT * FROM bookmarks WHERE photo_id = 35 and facebook_id = 19484;

それ以外の場合、「bookmarked」の値はFALSEになります。

これは単一のクエリで実行できますか?

編集-Tadmanのソリューションを少し変更しました。これが、完璧に機能します!

SELECT
users.first_name,
users.last_name,
photos.filename,
photos.YEAR,
photos.description,
themes.name AS theme_name,
bookmarks.id AS bookmark 

FROM
`photos`,
`users`,
`themes`

LEFT JOIN bookmarks ON bookmarks.photo_id = 35 AND bookmarks.facebook_id = 19484

WHERE
users.facebook_id = photos.author AND
themes.id = photos.theme AND
photos.id = 35

LIMIT 1;

このソリューションでは、「ブックマーク」をTRUEまたはFALSEに設定しませんが、NULLではなくNULLで作業できます。

4

2 に答える 2

2

LEFT JOIN存在する場合は、これを実行してブックマークをプルできます。理想的には、ユーザーごとに写真ごとに1つだけのブックマークを作成するか、ブックマークごとに1つずつ行を複製することができます。

SELECT
  ...,
  bookmarks.photo_id
FROM photos, users, themes
LEFT JOIN bookmarks ON bookmarks.photo_id=? AND photos.facebook_id=users.facebook_id
WHERE
  ...
LIMIT 1

LEFT JOINオプションの結合です。つまり、成功する場合と失敗する場合があり、失敗した場合は、関連付けられた列がとして残りますNULL。定義されていることを確認でき、bookmarks.photo_id定義されている場合はブックマークがあります。

これは、指定した条件?のプレースホルダーを表します。うまくいけば、このクエリにphotos.idプレースホルダーと適切なSQLエスケープを使用しています。

于 2012-08-19T05:12:44.960 に答える
0
SELECT
users.first_name,
users.last_name,
photos.filename,
photos.YEAR,
photos.description,
themes.name AS theme_name

FROM
`photos`,
`users`,
`themes`,
case (SELECT count(*) 
    FROM bookmarks 
    WHERE photo_id = photos.id 
    and facebook_id = users.facebook_id 
    group by photo_id, facebook_id
) when 0 then false
else 0
end case
WHERE
users.facebook_id = photos.author AND
themes.id = photos.theme AND
photos.id = 35
LIMIT 1;

注1:タイプミスなどが含まれます。それらを演習と見なしてください

注2:副選択が大きな数値を返す場合、すべてのブックマークを選択するため、パフォーマンスの問題になる可能性があります。これは、group byの代わりに、limit句を指定した別の副選択を使用して調整できます。

注3:Tadmansソリューションはおそらく現在の形式の方が高速ですが、そのlimit 1部分を失いたい場合は、彼のバージョンが壊れますが、これはまだ機能するはずです。

于 2012-08-19T05:21:02.453 に答える