Php 如何按计数或其他表中的某些条件排序

Php 如何按计数或其他表中的某些条件排序,php,mysql,sql,sorting,Php,Mysql,Sql,Sorting,我有一个创建问答网站的项目。 我想通过这些条件显示问题。 1.通过最新的问题显示,是的,我只知道order bycreated desc 2.按大多数答案显示和排序问题。 3.按投票最多的人对问题进行显示和排序。(和大多数答案一样)。 4.在未回答的地方显示问题 这是我在数据库中的表结构。 TABLE question COLUMNS q_id (primary key) userid title content created TABLE answer COLUMNS a_id (prima

我有一个创建问答网站的项目。
我想通过这些条件显示问题。

1.通过最新的问题显示,是的,我只知道order by
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


1显示最新问题。(已解决)

select * from question order by created desc
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
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
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
2按大多数答案显示和排序。(似乎慢了)

select * from question order by created desc
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
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
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
3按多数投票人显示和排序。(似乎慢了)。

select * from question order by created desc
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
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
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
4显示未回答的问题。(似乎慢了)

select * from question order by created desc
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
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
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
注意:如果使用
内部联接
则不会选择count=0的行。

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
正如我所想,其他网站通常都有字段来计算
答案
投票
?为了加快速度,我应该改成这个还是他们有一些算法,不需要在
问题
表中计算答案和投票

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.*, 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.*, 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;
但是,如前所述,这些更直接的查询不一定更快。不管怎样,你都可以试一下


因此,如果重新编写查询没有加快速度,那么,是的,您可以将答案和计票添加到您的问题表中。这当然是多余的,但如果需求需要这样做,那么就采取行动

您可以使用左连接来选择count=0的行,并加快添加索引或转到存储过程的过程