我有一个项目,创建一个网站。
我想通过这些条件来提出问题。
1. 根据最新的问题显示,是的,我知道只是按created desc
订购。
2. 根据大多数答案显示和排序问题。
3.显示和排序的问题,大多数投票。(和大多数答案一样)例子。
4. 提出没有回答的问题。示例
这是我在数据库中的表结构。
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
,计数= 0的行将不被选中。
answers
和votes
的统计领域了吗?为了使它更快,我应该改变这个,或者他们有一些不需要在question
表中计算答案和投票的算法?TABLE question
COLUMNS
q_id (primary key)
userid
title
content
created
answer_count
votes_count
帮助或建议将是真正感激。
您可以尝试重写您的查询,但是众所周知,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;
显示未回答的问题。如:
SELECT q.*
FROM question q
WHERE NOT EXISTS (select * from answer a where a.q_id = q.q_id)
ORDER BY q.created DESC;
然而,如前所述,这些更直接的查询并不一定更快。好吧,你可以试一试。
所以,如果重写查询不能加快速度,那么,是的,你可以在你的问题表中添加答案和投票计数。这当然是多余的,但是如果需求需要这样的步骤,那么就采取它。