mysql - 选择单个表中的数据 1 :Many relationship

标签 mysql sql mariadb

我有一个包含 67 列和大约 36,000 行的表,我需要根据其中两列运行 SELECT。

重要的列是FINANCIAL_ACCOUNT_ID、EVENT_DESCRIPTION。

FINANCIAL_ACCOUNT_ID 是每个帐户的唯一编号,但在表中可能不是唯一的。事件描述并不唯一。事件描述可以包含“事件 1”“事件 2”“事件 3”等。

所以表格可能如下所示:

TABLE
+----------------------+-------------------+-------------+
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF |
+----------------------+-------------------+-------------+
|  1121                |   Event 1         |     n/a     |
|  107401              |   Event 2         |     n/a     |
|  256483              |   Event 1         |     n/a     |
|  1121                |   Event 3         |     n/a     |
|  107401              |   Event 1         |     n/a     |
|  363586              |   Event 1         |     n/a     |
|  546875              |   Event 1         |     n/a     |
|  546875              |   Event 2         |     n/a     |
+----------------------+-------------------+-------------+


RESULT
+----------------------+-------------------+-------------+
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF |
+----------------------+-------------------+-------------+
|  107401              |   Event 2         |     n/a     |
|  107401              |   Event 1         |     n/a     |
|  546875              |   Event 1         |     n/a     |
|  546875              |   Event 2         |     n/a     |
+----------------------+-------------------+-------------+

如果存在同时包含“事件 1”和“事件 2”的金融帐户 ID,我需要返回的是整行。

我尝试过将WITH子句与内部联接相结合...在我最近的尝试中,我添加了一个计数(financial_account_id),例如:

 select FINANCIAL_ACCOUNT_ID, EVENT_DESCRIPTION, COUNT(FINANCIAL_ACCOUNT_ID)
 FROM master 
 group by FINANCIAL_ACCOUNT_ID 
 HAVING COUNT(FINANCIAL_ACCOUNT_ID) >1;

但是,以下是我在该 select 语句中看到的结果:

Financial_Account_ID | Event_Description | COUNT(Financial_Account_ID)
      107401         |      Event 2      |         2
      546875         |      Event 1      |         2    

(我说我需要整行,但是一旦返回正确的结果,我就可以过滤掉不需要的无关列。)

对于这样的 SQL 查询应该是什么样子有什么帮助吗? 详细信息:mariadb 10,数据库名称:JuneEvents,表名称:master 我还在 MS-SQL 2012 Express 数据库中获得了一份副本

编辑:@Tim - 抱歉,我需要将每个帐户与“事件 1”和“事件 2”匹配,抛出事件 3 以及任何其他可能存在的帐户。这清楚了吗?

解决方案: 我使用 @Gordon 的第二个查询,以 JOIN 作为起点,最终得到如下所示的最终查询:(注意:现在有一些额外的字段,但我在初始查询返回正确的结果后添加了它们初始数据集。)

SELECT t.financial_account_id, t.event_description, t.sold_quantity, t.paid_amount
FROM master t JOIN
     (SELECT financial_account_id
      FROM master t
      WHERE event_description IN ('Event 1', 'Event 2') 
      GROUP BY financial_account_id
      HAVING COUNT(DISTINCT event_description) = 2
     ) tt
     ON tt.financial_account_id = t.financial_account_id
     WHERE (event_description IN ('Event 1', 'Event 2') AND (sold_quantity > 0));

最佳答案

要获取包含这两个事件的帐户,请使用:

SELECT financial_account_id
FROM master t
WHERE event_description IN ('Event 1', 'Event 2')
GROUP BY financial_account_id
HAVING COUNT(DISTINCT event_description) = 2;

然后要获取原始行,请使用JOIN:

SELECT t.*
FROM master t JOIN
     (SELECT financial_account_id
      FROM master t
      WHERE event_description IN ('Event 1', 'Event 2')
      GROUP BY financial_account_id
      HAVING COUNT(DISTINCT event_description) = 2
     ) tt
     ON tt.financial_account_id = t.financial_account_id;

关于mysql - 选择单个表中的数据 1 :Many relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38194290/

相关文章:

MySQL - 非常简单的加入花费的时间太长

c# - SQL - 对员工进入时间进行分类

sql - Sequelize.js - 在 'findAll' 之后删除实例数组

mysql - COUNT with case 语句不能正常工作

mysql - 如何避免使用 Keycache 进行修复?

java - 当表有八列时,在数据库条目中搜索匹配项

python - 使用 Python 将 CSV 解析为 API 的数据库?

sql - 尝试使用表别名选择 null 作为 columnName

mysql - MariaDB 查询问题(忽略 ORDER BY)

sql - 当我尝试删除一些行时在ORDER BY附近使用正确的语法