python - 得到一个令人困惑的复杂 mysql 请求工作
问题描述
我不是 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
甚至在一般情况下,假设我的限制更加严格,并且想要选择所有与已婚人士具有相同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
,但我不太确定。
我觉得必须有一个简单的方法(或者我错了,迭代更容易),所以我问社区!
解决方案
一种方法是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
在表中快速查找给定值,同时检查married
status.m
推荐阅读
- image - 在本机反应中显示本地图像
- mysql - 尝试导入数据库时出现 SQL 错误 1193
- django - Django 从 django.core.wsgi 导入 get_wsgi_application
- javascript - 如何使用动态列号重新初始化 DataTable?
- scala - 执行上下文未关闭
- react-native - Button 中的文本不显示 ios 中的文本(本机基础)
- ajax - 使用钩子在按钮 onClick 事件时反应 ajax 调用
- visual-studio-2019 - 我怎么能关掉这个?视觉工作室 2019
- php - 为什么我使用 PHP cURL 的 GET 请求返回一个空白页?
- javascript - JS Visibility API - 切换到另一个应用程序窗口