首页 > 解决方案 > 得到一个令人困惑的复杂 mysql 请求工作

问题描述

我不是 SQL 方面的专家,但我最近开始sqlite3在数据库中使用模块,并与它Python一起使用,它们是一个非常好的工具。pandasread_sql_query()

现在,比如说,我有一个看起来像这样的数据库(我只是为了演示目的而编造了这个)。

age iq  married
===============
91  77  0
54  124 1
31  124 0
32  95  0
74  34  0
18  56  0
43  42  0
78  56  0
91  77  1

任务是,这可能会有点令人困惑。married=1我想选择与(包括已婚人士本身)具有相同智商的所有行(人)。所以我希望结果看起来像这样:

age iq  married
===============
91  77  0
54  124 1
31  124 0
91  77  1

甚至在一般情况下,假设我的限制更加严格,并且想要选择所有与已婚人士具有相同iq和相同的人。age在这种情况下,结果将如下所示:

age iq  married
===============
54  124 1
91  77  0
91  77  1

可能有大量其他列可以或不能被忽略。

现在我当然可以迭代地做到这一点,首先选择已婚的,然后比较 的元组(age,iq),但这有点无聊。问题是,是否有一种巧妙的方法可以一次性使用pandas.read_sql_query()?

所以简而言之,我正在尝试做这样的事情(我知道这只是选择已婚的,但这只是一个例子):

import sqlite3
import pandas as pd

connection = sqlite3.connect('people.db')
mydata = pd.read_sql_query(
                """
                SELECT *
                from People
                    WHERE married=1 ... *some magic here*
                    GROUP BY *foo*
                    HAVING *bar*
                """, connection)

我真的无法想出任何“魔法”来让它做我想做的事情(可能是因为对所有 SQL 命令和条件的了解不足)。也许有一种方法可以使用嵌套SELECT命令和一些类似的东西来做到这一点IN,但我不太确定。

我觉得必须有一个简单的方法(或者我错了,迭代更容易),所以我问社区!

标签: pythonmysqlsqlpandassqlite

解决方案


一种方法是EXISTS在子句中使用一个条件,该条件WHERE断言给定的 IQ 值与至少一个其他已婚记录匹配:

SELECT age, iq, married
FROM People p1
WHERE EXISTS (SELECT 1 FROM People p2 WHERE p1.iq = p2.iq AND p2.married = 1);

在此处输入图像描述

演示

使用以下EXISTS索引,子查询可能具有更好的性能:

CREATE INDEX idx ON People (iq, married);

这将允许iq在表中快速查找给定值,同时检查marriedstatus.m


推荐阅读