繁体   English   中英

MySQL COUNT() 不返回总数它分别计算每一行

[英]MySQL COUNT() not returning total number it is counting each rows separately

我的 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数据集

但它是单独计算每一行 id 的。 我不想要那个。 我想要的是,我想要总行数为 14,并且我想要它在一行中。 你能帮我实现这个吗?

提前致谢。

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

使用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%'
                    )
             );

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM