我创建了一个q& a网站的项目
我想通过这些条件来表达问题。
1.按最新问题显示,是的,我知道只是按created desc
订购
2.按大多数答案显示和排序问题
3.通过大多数投票显示和排序问题。 (像大多数答案一样)example。
4.显示无人接听的问题。 example
这是我在数据库中的表结构。
TABLE question
COLUMNS
q_id (primary key)
userid
title
content
created
TABLE answer
COLUMNS
a_id (primary key)
userid
q_id
content
created
TABLE vote
COLUMNS
userid
q_id
created
每张桌子都有一百万行。
对于我上面的4个问题,我尝试了这些SQL
(s)。
1显示最新的问题。 (解决)
select * from question order by created desc
2按大多数答案显示和排序。 (似乎慢)
SELECT q.*, COUNT(a.id) as answerCount
FROM question q
LEFT JOIN answer a
ON (q.q_id = a.q_id)
ORDER BY answerCount DESC
3按投票最多显示和排序。 (似乎很慢)。
SELECT q.*, COUNT(v.id) as voteCount
FROM question q
LEFT JOIN vote v
ON (q.q_id = v.q_id)
ORDER BY voteCount DESC
4显示无人接听的问题。 (似乎慢)
SELECT q.*
FROM question q
LEFT JOIN answer a
ON p.q_id = a.q_id
WHERE a.q_id IS NULL ORDER BY q.created DESC
注意:如果我使用INNER JOIN
,则不会选择count = 0的行。
我认为,其他网站通常都有字段来计算answers
和votes
吗?为了使它快速,我应该改为这个或他们有一些算法,不需要在question
表中计算答案和投票?
TABLE question
COLUMNS
q_id (primary key)
userid
title
content
created
answer_count
votes_count
真正感谢帮助或建议。
答案 0 :(得分:1)
您可以尝试重新编写查询,但由于MySQL以更直接的方式更喜欢连接,因此它们可能不会更快。以下是您可以尝试的一些查询:
按大多数答案显示和排序。使用GROUP BY和COUNT(*)使您明白自己的行为。
SELECT q.*, COUNT(*) as answerCount
FROM question q
LEFT JOIN answer a ON a.q_id = q.q_id
GROUP BY q.q_id
ORDER BY answerCount DESC;
按大多数答案显示和排序。计入子查询。
SELECT q.*, (select count(*) from answers a where a.q_id = q.q_id) as answerCount
FROM question q
ORDER BY answerCount DESC;
按大多数答案显示和排序。计算派生表查询。
SELECT q.*, a.answerCount
FROM question q
LEFT JOIN (select q_id, count(*) as answerCount from answers group by q_id) a
ON a.q_id = q.q_id
ORDER BY a.answerCount DESC;
显示无人接听的问题。即哪里没有答案EXISTS:
SELECT q.*
FROM question q
WHERE NOT EXISTS (select * from answer a where a.q_id = q.q_id)
ORDER BY q.created DESC;
然而,如上所述,这些更直接的查询不一定更快。好吧,无论如何你都可以尝试一下。
因此,如果重新编写查询并不能加快速度,那么,是的,您可以在问题表中添加答案和投票计数。这当然是多余的,但如果要求需要这样的步骤,那就接受它。