【问题标题】:How to count all rows with multiple table joins and where conditions?如何计算具有多个表连接的所有行以及条件?
【发布时间】:2021-07-21 23:28:05
【问题描述】:

我有以下表格:

create table loans
(
    id int null,
    status int null,
    user_id int null
);

INSERT INTO loans VALUES (1, 1, 1);
INSERT INTO loans VALUES (2, 0, 1);
INSERT INTO loans VALUES (3, 1, 1);

create table deals
(
    id int null,
    status int null,
    user_id int null
);

INSERT INTO deals VALUES (2, 0, 1);
INSERT INTO deals VALUES (3, 0, 1);

create table listings
(
    id int null,
    status int null,
    user_id int null
);

INSERT INTO listings VALUES (1, 1, 1);
INSERT INTO listings VALUES (2, 1, 1);
INSERT INTO listings VALUES (3, 1, 1);

并有以下SQL:

SELECT COUNT(*) AS active_items
FROM loans
    LEFT JOIN deals ON deals.user_id = 1
    LEFT JOIN listings ON listings.user_id = 1
WHERE
  loans.status = 1
  AND deals.status = 1
  AND listings.status = 1
  AND loans.user_id = 1

目标是计算每个表项的状态为 1 的所有行,而忽略任何状态为 0 的行。我所做的查询似乎一直只返回 0,我不明白为什么?如何查询数据库,以便找到状态为 1 并返回一个名为 active_items 的每个贷款、交易和列表?为什么我的查询不起作用?

DB 小提琴:https://www.db-fiddle.com/f/g9CoA9CdDujqzG4ZpgmJXh/1

active_items 的输出预计为 5。

【问题讨论】:

标签: mysql join count


【解决方案1】:

不要为此使用JOIN,因为您没有将表格相互关联。只需执行 3 个单独的查询并添加计数。

SELECT SUM(count) AS total
FROM (
    SELECT COUNT(*) AS count
    FROM loans
    WHERE user_id = 1 AND status = 1
    UNION ALL
    SELECT COUNT(*) AS count
    FROM deals
    WHERE user_id = 1 AND status = 1
    UNION ALL
    SELECT COUNT(*)
    FROM listings
    WHERE user_id = 1 AND status = 1
) AS x

DEMO

【讨论】:

  • 这已经解决了我的问题,这对性能也可以吗?
  • 只要表有合适的索引就可以了。
【解决方案2】:

我不是 100% 清楚您要检查的内容。 但是,如果我理解正确,我认为您遇到的问题是您只检查 user_id = 1,它可能在所有表中都没有状态 1(如果没有看到您的数据,我真的无法确定)。 我想你想做这样的事情:

SELECT COUNT(*) AS active_items
FROM loans
    INNER JOIN deals ON deals.user_id = loans.user_id
    INNER JOIN listings ON listings.user_id = loans.user_id
WHERE
  loans.status = 1
  AND deals.status = 1
  AND listings.status = 1

【讨论】:

  • 我正在尝试计算所有状态为 1 的用户 ID 为 1 的行。这对我不起作用。我附上了一个带有一些示例数据的 DB Fiddle 并期待结果。
  • 对不起,我已经更新了我的数据库小提琴,预期的结果应该是 5:db-fiddle.com/f/g9CoA9CdDujqzG4ZpgmJXh/1
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多