0

データベースに2つのテーブルがあります(実際にはそれ以上ですが、現在は問題ありません)。

1つのテーブルには、ステータスが「公開」または「ゴミ箱」の本が格納されます。書籍は、その書籍がもう持ち運ばれていないかどうかに基づいて、公開またはゴミ箱のステータスになります。

もう1つのテーブルには、特定のユーザーが特定の本を読んだかどうかに関するデータが格納されます。

ユーザーが読んだ、まだ読んでいない、まだ持っているすべての本のリストを表示したいと思います。両方のテーブルを結合し、ステータスに関係なく、特定のユーザーと既読の日付、または未読の場合はNULLと各本を照合するクエリを作成しました。問題は、ユーザーがまだ読んでいない本を表示したいのに、ユーザーが読んでいない(ゴミ箱の状態になっている)本を表示したくないということです。

現在、私はそれを達成することができませんでした。PHP側のforeachループでは、ゴミ箱のステータスの本が読まれているかどうかを確認し、読まれていない場合はスキップします。これは私が感じるデータベース側では非効率的です。

以下は私が現在持っているスクリプトです。私が達成しようとしていることは可能でさえありますか?それは多かれ少なかれ効率的でしょうか?助けてくれてありがとう。

 SELECT 
     book.ID as actual_book_id,
     book.post_title,
     book.post_status,
     read.*
 FROM books as book
 LEFT OUTER JOIN book_club as read
     ON read.book_id = book.ID
     AND read.user_id = $userID
 WHERE book.post_type = 'book'
     AND book.post_status IN ('publish','trash')
 ORDER BY
     book.post_title ASC

$userIDがユーザーに関連する有効な整数であると想定します

4

2 に答える 2

1

INだけでなく、もう少し複雑な句を追加する必要があります。

SELECT 
     book.ID as actual_book_id,
     book.post_title,
     book.post_status,
     read.*
 FROM books as book
 LEFT OUTER JOIN book_club as read
     ON read.book_id = book.ID
     AND read.user_id = $userID
 WHERE book.post_type = 'book'
     AND (book.post_status  = 'publish' OR
          (book.post_status = 'trash' AND read.<columnDate> IS NOT NULL))
 ORDER BY
     book.post_title ASC
于 2013-02-02T21:02:36.457 に答える
0

user_idの前と、本の検索後に試してみることができると思います。次に例を示します。

SELECT 
     book.id as actual_book_id,
     book.post_title,
     book.post_status,
     r.*
FROM 
(
      SELECT 
           user_read.* 
      FROM book_club AS user_read 
      WHERE user_read.user_id = $userID
) AS r 
LEFT JOIN books as book ON r.book_id = book.id 
WHERE book.post_type = 'book'
     AND book.post_status IN ('publish','trash')
 ORDER BY
     book.post_title ASC

このようにして、指定されたuserIDのpost_status='publish'または'trash'の本のみを表示する必要があります。

于 2013-02-02T22:12:39.270 に答える