stackoverflow の Q&A 機能に似たシステムがあります。主な違いは、各質問に有効期限があることです。
CREATE TABLE questions (
id INT NOT NULL AUTO_INCREMENT,
title CHAR(100) NOT NULL,
details TEXT
PRIMARY KEY (id)
)
CREATE TABLE answers (
id INT NOT NULL AUTO_INCREMENT,
question_id INT NOT NULL
details TEXT
expiration_datetime DATETIME
score INT
PRIMARY KEY (id)
)
スコア順に並べられた、有効期限が切れていない上位 N 個の回答と一緒に質問を表示したいと考えています。私はこのようなことを考えています:
SELECT * FROM questions, answers
WHERE questions.id=1 AND questions.id=answers.question_id AND answers.expiration_datetime > NOW()
ORDER BY answers.score DESC LIMIT 10
いくつかの質問:
1) 上記のクエリは、私がやりたいことを行うための最も効率的な方法ですか? 次のように JOIN を明示的に使用する場合とどう違うのですか。
SELECT * FROM questions JOIN answers ON questions.id=answers.question_id
WHERE questions.id=1 AND answers.expiration_datetime > NOW()
ORDER BY answers.score DESC LIMIT 10
2) クエリでインデックスを使用するにはどうすればよいですか? このインデックスをTABLEの回答に追加することを考えています:
INDEX (question_id, expiration_datetime, score)
上記のインデックスは私のクエリで機能しますか? スコアを降順にする必要があるのに、expiration_datetime が昇順であるため、正しくないようです。ここで何ができますか?