如何通过其他表中的计数或某些条件来订购

时间:2014-08-25 06:53:03

标签: php mysql sql sorting

我创建了一个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的行。

我认为,其他网站通常都有字段来计算answersvotes吗?为了使它快速,我应该改为这个或他们有一些算法,不需要在question表中计算答案和投票?

TABLE question
COLUMNS
q_id (primary key)
userid
title
content
created
answer_count
votes_count

真正感谢帮助或建议。

1 个答案:

答案 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;

然而,如上所述,这些更直接的查询不一定更快。好吧,无论如何你都可以尝试一下。

因此,如果重新编写查询并不能加快速度,那么,是的,您可以在问题表中添加答案和投票计数。这当然是多余的,但如果要求需要这样的步骤,那就接受它。