0

次のテーブルがあります。

User (id, name)
Item (id, title, text)
Like (id, itemId, userId)

Like テーブルには、Item と User の間の has-and-belongs-to-many 関係が格納されます。

アイテムからリストを選択し、「ログインした」ユーザーがその特定のアイテムを「気に入った」かどうかを確認する最も効率的な方法は何ですか?

SELECT * FROM Item ORDER BY published DESC LIMIT 10
(+ check if each Item has been liked by known user id, e.g. '123')

これは、副選択、結合、または 2 つの個別のクエリで行うのが最適ですか?

4

2 に答える 2

0

結合は副選択よりも効果的であり、データベース エンジンはテーブルの結合に対して十分に最適化されています。

クエリ (SQL のキーワードであるため、テーブルの名前を「like」に変更しました)

SELECT COUNT(*)
FROM User u 
JOIN Likes l ON u.id = l.userID
JOIN Item i ON l.itemid = i.id
WHERE i.title = 'item' AND u.name = 'user'

結果が 0 より大きい場合、ユーザーはアイテムを気に入っています。

編集: 最新の 10 個のアイテムを表示し、ユーザーがそれらを気に入ったかどうかを確認する場合は、次のクエリを使用できます。

SELECT i.id, i.title, IF(l.userID IS NULL, 0, 1) AS Liked
FROM item i 
LEFT JOIN Likes l ON i.id = l.itemID AND l.userID = ?
ORDER BY i.published DESC LIMIT 10

LEFT JOIN を使用することが重要です。そうしないと、ユーザーが気に入らなかった行を取得できません。

于 2012-09-04T19:10:00.973 に答える
0

最も簡単な方法(質問を正しく理解していれば)は

select * from Like where itemId = ? and userId = ?;

チェックしたい itemId とセッションからの userId があると仮定します。テーブル Like と列 itemId、userId に複合インデックスを設定して、クエリをすばやく返すとよいでしょう。

于 2012-09-04T19:11:41.873 に答える