从表和参考表中选择列、count(id)

Posted

技术标签:

【中文标题】从表和参考表中选择列、count(id)【英文标题】:Select columns, count(id) from table and reference table 【发布时间】:2015-09-07 15:29:34 【问题描述】:

我有一个查询,我想从两个表(父表和参考表)中获取列,并选择参考表上每个帖子的类别总数

文章

id
title
poster
pdate
content

类别

id
name

cats_rel(具有外键约束的关系表)

id
pid
cat_id

我想获取具有一个类别 ID 和每个帖子的类别总数的帖子列表。

我用它来获取所需的数据,但速度很慢。有没有更好的方法可以更快地获得它?

SELECT cc.id, title, poster, pdate, content, js.pid, js.sno 
FROM articles cc LEFT JOIN 
(SELECT pid, cat_id, count(cat_id) as sno FROM cats_rel GROUP BY pid)js 
ON js.pid = cc.id WHERE cc.status='approved' ORDER BY cc.id DESC

【问题讨论】:

@GordonLinoff 抱歉,已修复。 【参考方案1】:

您不需要内部查询。

SELECT cc.id, title, poster, pdate, content, js.pid, count(js.cat_id) as sno 
FROM articles wp 
LEFT JOIN cats_rel js ON js.pid = cc.id
WHERE wp.status='approved'
group by cc.id, title, poster, pdate, content, js.pid
ORDER BY cc.id DESC

【讨论】:

【参考方案2】:

我会使用相关子查询重写查询

SELECT cc.id, cc.title, cc.poster, cc.pdate, cc.content, 
       (SELECT COUNT(*)
        FROM cats_rel js
        WHERE js.pid = cc.id
       ) as sno 
FROM articles cc
WHERE cc.status = 'approved'
ORDER BY cc.id DESC;

(看来js.pidselect列表中是多余的。)

对于此查询,您需要两个索引:articles(status, id desc)cats_rel(pid)

【讨论】:

我想在总数旁边获取一个类别 ID (js.pid)。 很好,但这不是您的问题所要求的。它正在获取pid,当有匹配时相当于cc.id

以上是关于从表和参考表中选择列、count(id)的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中选择所有列并计数?

Sqlite:从表中选择 * 但 id

仅从表中选择一些列

从表中随机选择一定百分比的条目

从表中选择最新的带时间戳的值,该表对于一个列 id 有多个条目,对于每个唯一的列 id 和来自另一个表的数据

从表中选择具有最大日期的行