【问题标题】:Executing a complex query in SQLite在 SQLite 中执行复杂的查询
【发布时间】:2012-02-22 03:42:47
【问题描述】:

我有一个复杂的 SQLite 查询,旨在从 3 个相关表中获取总数。

以下是我的表格示例:

----
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 在组合查询方面存在一些限制。感谢您的所有帮助!

【问题讨论】:

    标签: c# sqlite


    【解决方案1】:

    很难判断我是否正确,但您应该能够在单个查询中执行操作...类似于:

    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
    

    应该给你类似的东西:

    芝加哥,1,4000 芝加哥, 2, 3355 丹佛, 1, 2580 等等……

    好的,这是我刚刚在 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>
    

    【讨论】:

    • 谢谢大家。巨大的帮助。我仍在努力思考逻辑,但它似乎正在返回正确的数据。谢谢!
    【解决方案2】:

    每个城市和调查:

    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
    

    【讨论】:

      【解决方案3】:

      您应该能够一次性提取所有信息,只需更改您的查询:

      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]);
      }    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        相关资源
        最近更新 更多