如何按计数或其他表的一些条件排序


How to order by count or some conditions from other table

我有一个项目,创建一个网站。
我想通过这些条件来提出问题。

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的行将不被选中。

据我所知,其他网站一般已经有answersvotes的统计领域了吗?为了使它更快,我应该改变这个,或者他们有一些不需要在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;
然而,如前所述,这些更直接的查询并不一定更快。好吧,你可以试一试。

所以,如果重写查询不能加快速度,那么,是的,你可以在你的问题表中添加答案和投票计数。这当然是多余的,但是如果需求需要这样的步骤,那么就采取它。