社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL COUNT()不返回总数,而是分别计算每行的数量

Bearded • 3 年前 • 1346 次点击  

我的MySQL查询有一些问题,我需要一些指导。我正在创建搜索,我想知道在我的查询搜索中找到了多少项。但问题是,我的查询分别返回每行的计数,而不是返回总计数。这就是我现在所拥有的。

我的问题

SELECT
    COUNT(t.id) AS total
FROM
    trouble t
LEFT JOIN district d ON d.id = t.district
LEFT JOIN country c ON c.id = t.country
LEFT JOIN multi_category mc ON mc.t_id = t.id
LEFT JOIN category ct ON ct.id = mc.ct_id
LEFT JOIN state s ON s.id = t.state
WHERE
    t.name      LIKE '%keyword%' OR
    t.title     LIKE '%keyword%' OR
    t.tags      LIKE '%keyword%' OR
    ct.category LIKE '%keyword%' OR
    c.country   LIKE '%keyword%' OR
    s.state     LIKE '%keyword%' OR
    d.district  LIKE '%keyword%'
GROUP BY
    t.id

我的数据库中有14行包含我正在搜索的关键字,这个查询返回14行,这里是一个快照。

mysql data set

但它是逐个计算每一行的id。我不想那样。我想要的是,我想要的总行数是14,我想要它在一行中。你能帮我做到这一点吗?

提前谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129230
 
1346 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Gordon Linoff
Reply   •   1 楼
Gordon Linoff    4 年前

使用 exists 而不是 LEFT JOIN s、 当存在多个匹配项时,连接只是将行相乘:

SELECT COUNT(*)
FROM trouble t
WHERE t.name LIKE '%keyword%' OR
      t.title LIKE '%keyword%' OR
      t.tags LIKE '%keyword%' OR
      EXISTS (SELECT 1
              FROM district d
              WHERE d.id = t.district AND d.district LIKE '%keyword%'
             ) OR
      EXISTS (SELECT 1
              FROM country c
              WHERE c.id = t.country AND c.country LIKE '%keyword%'
             ) OR
      EXISTS (SELECT 1
              FROM state s
              WHERE s.id = t.state AND s.state LIKE '%keyword%'
             ) OR
      EXISTS (SELECT 1
              FROM multi_category mc JOIN 
                   category ct
                   ON ct.id = mc.ct_id 
              WHERE mc.t_id = t.id AND
                    (ct.category LIKE '%keyword%' OR
                     c.country LIKE '%keyword%'
                    )
             );

通过消除多行的创建,这也应该更快。

Meysam Asadi
Reply   •   2 楼
Meysam Asadi    4 年前

首先获取唯一的ID数,然后返回ID总数。

SELECT count(*) AS Total
FROM 
( 
    SELECT DISTINCT t.id
    FROM trouble t
      LEFT JOIN district d ON d.id = t.district
      LEFT JOIN country c ON c.id = t.country
      LEFT JOIN multi_category mc ON mc.t_id = t.id
      LEFT JOIN category ct ON ct.id = mc.ct_id
      LEFT JOIN state s ON s.id = t.state
      WHERE
          t.name LIKE '%keyword%' OR
          t.title LIKE '%keyword%' OR
          t.tags LIKE '%keyword%' OR
          ct.category LIKE '%keyword%' OR
          c.country LIKE '%keyword%' OR
          s.state LIKE '%keyword%' OR
          d.district LIKE '%keyword%'
      GROUP BY t.id
) resultTable