获得一个令人困惑的复杂的mysql请求工作

时间:2019-08-01 05:16:20

标签: python mysql sql pandas sqlite

我不是SQL方面的专家,但是最近我开始在sqlite3中的Python模块中使用数据库,并与pandas及其read_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

甚至一般来说,我的限制更为严格,希望选择与已婚者具有相同iqage的所有人员。在这种情况下,结果将如下所示:

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之类的方法来做到这一点,但我不确定。

我觉得必须有一个简单的方法(否则我可能错了,并且迭代起来更容易),所以我要问社区!

2 个答案:

答案 0 :(得分:3)

一种方法是在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);

enter image description here

Demo

EXISTS子查询在使用以下索引的情况下可能会具有更好的性能:

CREATE INDEX idx ON People (iq, married);

这将允许在表中快速查找给定的iq值,并检查married的状态。m

答案 1 :(得分:1)

尝试此查询:

select * from People
where iq in (
    select iq from People
    group by iq
    having sum(married) > 0
)