Py学习  »  DATABASE

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

Bearded • 3 年前 • 1274 次点击  

我的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
 
1274 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Gordon Linoff
Reply   •   1 楼
Gordon Linoff    3 年前

使用 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    3 年前

首先获取唯一的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