C# 在SQLite中执行复杂查询
我有一个使用SQLite的复杂查询,它试图从3个相关表中获取总数 以下是我的表格示例:C# 在SQLite中执行复杂查询,c#,sqlite,C#,Sqlite,我有一个使用SQLite的复杂查询,它试图从3个相关表中获取总数 以下是我的表格示例: ---- cities ---- id, name ---- surveys ---- id, cities_id ---- population ---- id, survey_id 我需要找到每个城市被调查的总人数 这是我一直在使用c的方法,但我相信应该有一种更直接的方法通过SQLite来实现这一点。另外,我的大脑并没有用c来解决我的最后一步 //ge
----
cities
----
id, name
----
surveys
----
id, cities_id
----
population
----
id, survey_id
我需要找到每个城市被调查的总人数
这是我一直在使用c的方法,但我相信应该有一种更直接的方法通过SQLite来实现这一点。另外,我的大脑并没有用c来解决我的最后一步
//get a list of all cities
List<string> cities = new List<string>();
cmd.CommandText = "SELECT * from cities ";
cmd.ExecuteScalar();
SqlCeDataReader myReader = cmd.ExecuteReader();
while (myReader.Read())
{
list_cities.Add(myReader["id"].ToString().Trim());
}
//get survey ids related to these citities
List<list_key_val> list_survey_ids = new List<list_key_val>();
foreach (String city_id in cities)
{
cmd.CommandText = "SELECT * from surveys WHERE city_id = '" + city_id + "'";
cmd.ExecuteScalar();
SqlCeDataReader myReader = cmd.ExecuteReader();
while (myReader.Read())
{
list_survey_ids.Add(new list_key_val()
{
key = city_id,
val = myReader["id"].ToString().Trim()
});
}
}
//find total surveyed person count for each survey id.
List<list_key_val> list_surveyed_total = new List<list_key_val>();
foreach (String survey_id in list_survey_ids)
{
cmd.CommandText = "SELECT COUNT(*) from population WHERE survey_id = '" + survey_id + "'";
cmd.ExecuteScalar();
list_surveyed_total.Add(new list_key_val()
{
key = survey_id,
val = count = (int)cmd.ExecuteScalar();
}
}
//find surveyed count as city id -> survey id -> surveyed count
List<list_key_val> list_city_surveyed_total = new List<list_key_val>();
foreach (String city_id in list_cities)
{
//dar... complex nested key calculations here, possibly?
}
我知道SQLite在组合查询时有一些限制。谢谢你的帮助 每个城市和调查:
select count(c.id) as num, c.name, s.id as survey from cities c, sirveys s, population p
where
c.id = s.cities_id AND
s.id = p.survey_id
group by c.name, s.id
每个城市:
select count(c.id) as num, c.name, from cities c, sirveys s, population p
where
c.id = s.cities_id AND
s.id = p.survey_id
group by c.name
按城市和调查:
select count(c.id) as num, c.name, s.id as survey from cities c, sirveys s, population p
where
c.id = s.cities_id AND
s.id = p.survey_id
group by c.name, s.id
每个城市:
select count(c.id) as num, c.name, from cities c, sirveys s, population p
where
c.id = s.cities_id AND
s.id = p.survey_id
group by c.name
您应该能够一次性获取所有信息,只需更改查询:
var query =
"SELECT c.name, s.id, COUNT(*) " +
"FROM cities c " +
"JOIN surveys s ON (c.id = s.cities_id) " +
"JOIN population p ON (s.id = p.survey_id) " +
"GROUP BY c.name, s.id";
cmd.CommandText = query;
SqlCeDataReader myReader = cmd.ExecuteReader();
while (myReader.Read())
{
Console.WriteLine("City {0}, survey {1} = {2}", myReader[0], myReader[1],
myReader[2]);
}
您应该能够一次性获取所有信息,只需更改查询:
var query =
"SELECT c.name, s.id, COUNT(*) " +
"FROM cities c " +
"JOIN surveys s ON (c.id = s.cities_id) " +
"JOIN population p ON (s.id = p.survey_id) " +
"GROUP BY c.name, s.id";
cmd.CommandText = query;
SqlCeDataReader myReader = cmd.ExecuteReader();
while (myReader.Read())
{
Console.WriteLine("City {0}, survey {1} = {2}", myReader[0], myReader[1],
myReader[2]);
}
很难说我是否正确,但您应该能够在一个查询中执行该操作。。。比如:
select cities.name, surveys.id, count(*) total
from cities, surveys, population
where cities.id = surveys.cities_id and surveys.id=population.survey_id
group by cities.name, surveys.id
应该给你一些类似的东西:
芝加哥,14000
芝加哥,23355
丹佛,12580
等等
好的,这里是我刚刚在sqlite中做的一个测试的转储
sqlite> create table cities (id integer primary key, name text);
sqlite> create table surveys (id integer primary key, cities_id integer);
sqlite> create table population (id integer primary key, survey_id integer);
sqlite> insert into cities values (1, 'Chicago');
sqlite> insert into cities values (2, 'Denver');
sqlite> insert into surveys values (1, 1);
sqlite> insert into surveys values (2, 1);
sqlite> insert into surveys values (3, 2);
sqlite> insert into population values (1, 1);
sqlite> insert into population values (2, 1);
sqlite> insert into population values (3, 1);
sqlite> insert into population values (4, 1);
sqlite> insert into population values (5, 2);
sqlite> insert into population values (6, 2);
sqlite> insert into population values (7, 2);
sqlite> insert into population values (8, 3);
sqlite> insert into population values (9, 3);
sqlite> select cities.name, surveys.id, count(*) total
...> from cities, surveys, population
...> where cities.id = surveys.cities_id and
...> surveys.id=population.survey_id
...> group by cities.name, surveys.id
...> ;
Chicago|1|4
Chicago|2|3
Denver|3|2
sqlite>
很难说我是否正确,但您应该能够在一个查询中执行该操作。。。比如:
select cities.name, surveys.id, count(*) total
from cities, surveys, population
where cities.id = surveys.cities_id and surveys.id=population.survey_id
group by cities.name, surveys.id
应该给你一些类似的东西:
芝加哥,14000
芝加哥,23355
丹佛,12580
等等
好的,这里是我刚刚在sqlite中做的一个测试的转储
sqlite> create table cities (id integer primary key, name text);
sqlite> create table surveys (id integer primary key, cities_id integer);
sqlite> create table population (id integer primary key, survey_id integer);
sqlite> insert into cities values (1, 'Chicago');
sqlite> insert into cities values (2, 'Denver');
sqlite> insert into surveys values (1, 1);
sqlite> insert into surveys values (2, 1);
sqlite> insert into surveys values (3, 2);
sqlite> insert into population values (1, 1);
sqlite> insert into population values (2, 1);
sqlite> insert into population values (3, 1);
sqlite> insert into population values (4, 1);
sqlite> insert into population values (5, 2);
sqlite> insert into population values (6, 2);
sqlite> insert into population values (7, 2);
sqlite> insert into population values (8, 3);
sqlite> insert into population values (9, 3);
sqlite> select cities.name, surveys.id, count(*) total
...> from cities, surveys, population
...> where cities.id = surveys.cities_id and
...> surveys.id=population.survey_id
...> group by cities.name, surveys.id
...> ;
Chicago|1|4
Chicago|2|3
Denver|3|2
sqlite>
谢谢大家。巨大的帮助。我仍在试图理解逻辑,但它似乎正在返回正确的数据。谢谢谢谢大家。巨大的帮助。我仍在试图理解逻辑,但它似乎正在返回正确的数据。谢谢