优化 SELECT id,title,subtitle,label,( SELECT COUNT(*) FROM content_info WHERE theme_id=topic.id AND is_delete=1 GROUP BY id) AS contentNum,( SELECT COUNT(*) FROM content_info WHERE theme_id=topic.id AND is_delete=1 GROUP BY union_id) AS peopleNum FROM topic
时间: 2024-03-25 22:40:13 浏览: 14
这个 SQL 查询语句中包含了两个子查询,可能会对查询性能产生一定的影响。可以尝试使用 JOIN 或者子查询优化来提高查询性能。
以下是使用 JOIN 进行优化的示例代码:
```
SELECT topic.id, topic.title, topic.subtitle, topic.label,
COUNT(DISTINCT content_info.id) AS contentNum,
COUNT(DISTINCT content_info.union_id) AS peopleNum
FROM topic
LEFT JOIN content_info ON topic.id = content_info.theme_id
WHERE content_info.is_delete = 1
GROUP BY topic.id;
```
这个查询语句使用了 LEFT JOIN 将 topic 表和 content_info 表连接起来,然后使用 WHERE 子句过滤掉 is_delete 不为 1 的记录。最后使用 GROUP BY 子句对 topic.id 进行分组,使用 COUNT 函数统计 content_info 表中的记录数量。
另外,可以考虑对 topic.id、content_info.id、content_info.union_id 这些字段创建索引,以提高查询性能。
相关问题
SELECT id,title,subtitle,label,( SELECT COUNT(*) FROM content_info WHERE theme_id=topic.id AND is_delete=1 GROUP BY id) AS contentNum,( SELECT COUNT(*) FROM content_info WHERE theme_id=topic.id AND is_delete=1 GROUP BY union_id) AS peopleNum FROM topic contentNum和peopleNum 为什么等于null
在这个查询语句中,contentNum 和 peopleNum 的值可能会为 NULL 是因为子查询中使用了 GROUP BY 子句,而没有对 id 和 union_id 进行聚合操作。这样会导致子查询返回多个值,而 SELECT 子句只能接受一个值,因此会抛出一个错误。解决方法有两种:
1. 在子查询中去掉 GROUP BY 子句,改用 COUNT(*) 统计总数。
```
SELECT id, title, subtitle, label,
(SELECT COUNT(*) FROM content_info WHERE theme_id = topic.id AND is_delete = 1) AS contentNum,
(SELECT COUNT(DISTINCT union_id) FROM content_info WHERE theme_id = topic.id AND is_delete = 1) AS peopleNum
FROM topic;
```
2. 在子查询中使用 GROUP BY 子句,并将聚合函数的结果命名为一个别名,然后在外层查询中使用 MAX 或者 SUM 函数来获取别名对应的值。
```
SELECT id, title, subtitle, label,
MAX(contentNum) AS contentNum,
MAX(peopleNum) AS peopleNum
FROM (
SELECT topic.id, topic.title, topic.subtitle, topic.label,
COUNT(*) AS contentNum,
COUNT(DISTINCT union_id) AS peopleNum
FROM topic
LEFT JOIN content_info ON topic.id = content_info.theme_id
WHERE content_info.is_delete = 1
GROUP BY topic.id
) t;
```
这个查询中,使用了一个子查询来计算 contentNum 和 peopleNum 的值,并将结果命名为别名。然后在外层查询中使用 MAX 函数来获取别名对应的值,这样就可以避免由于子查询返回多个值而导致的 NULL 值问题。
select * FROM sockpuppet_cust_extend where partner_id = '1000163' and HAVING COUNT(cbm_work_id) > 0
在的SQL语句中,`HAVING` 子句应该紧跟在 `GROUP BY` 子句之后,用于在分组后对结果进行过滤。在您的语句中,似乎缺少 `GROUP BY` 子句。如果您想查询 `sockpuppet_cust_extend` 表中 `partner_id` 为 '1000163' 且 `cbm_work_id` 记录数大于 0 的记录,可以使用以下SQL语句:
```
SELECT * FROM sockpuppet_cust_extend WHERE partner_id = '1000163' GROUP BY partner_id HAVING COUNT(cbm_work_id) > 0;
```
这条语句首先通过 `WHERE` 子句筛选出 `partner_id` 为 '1000163' 的记录,然后通过 `GROUP BY` 子句对这些记录进行分组,最后通过 `HAVING` 子句筛选出 `cbm_work_id` 记录数大于 0 的记录。