【问题标题】:Combine two mysql queries with different where clauses将两个具有不同 where 子句的 mysql 查询结合起来
【发布时间】:2012-01-24 00:04:21
【问题描述】:

我在多个位置都有结果。位置存储在一个表中,结果存储在另一个表中。我用荷兰的一个位置查询每个结果。 我将这些结果按所在省分组。之后,我使用纬度、经度在谷歌地图上标记每个省的结果。

查询:

SELECT   loc.location_id as loc_id, loc.lat, loc.long, count(res.unique_id) as aantal, loc.land, loc.provincie, loc.gemeente, loc.plaats 
FROM     `vj_results_1618048029` AS res, vj_location AS loc 
WHERE    res.time > '1324635105' AND res.time < '1327313506' AND res.search_id='8070' AND (loc.lat != '0' AND loc.long != '0') AND res.location_id != '' AND res.location_id = loc.location_id  AND loc.land = 'Nederland'
GROUP BY loc.provincie 
ORDER BY loc.land, loc.provincie, loc.gemeente, loc.plaats DESC

结果:

loc_id  lat         long        aantal  land        provincie       gemeente    plaats
19      52.132633   5.291266    5732    Nederland            
672     52.926438   6.791355    670     Nederland   Drenthe         Borger-Odoorn   Borger
67      52.518537   5.471422    597     Nederland   Flevoland       Lelystad        Lelystad
401     53.1641642  5.7817542   812     Nederland   Friesland            
52      51.842867   5.854622    3486    Nederland   Gelderland      Nijmegen        Nijmegen    
63      53.2193835  6.5665018   890     Nederland   Groningen       Groningen       Groningen
185     50.9555426  5.8248384   670     Nederland   Limburg         Sittard-Geleen  Geleen
183     51.5657089  5.081203    3241    Nederland   Noord-Brabant   Tilburg         Tilburg
168     52.632281   4.750806    6044    Nederland   Noord-Holland   Alkmaar         Alkmaar
223     52.3116551  6.9268283   1324    Nederland   Overijssel      Oldenzaal       Oldenzaal
37      52.0901422  5.1096649   2291    Nederland   Utrecht         Utrecht         Utrecht
2723    51.5332946  4.2162383   413     Nederland   Zeeland         Tholen          Tholen
65      51.924216   4.481776    5842    Nederland   Zuid-Holland    Rotterdam       Rotterdam

问题是我收到的纬度经度是该组中第一个结果的最窄位置的经度。对于 flevoland,它是“lelystad”城市,对于 zeeland,是“tolen”镇。在“弗里斯兰”它是准确的,因为第一个结果没有指定一个城镇,只是一个省。

为了得到正确的纬度和经度,我会这样查询:

SELECT   location_id as loc_id, loc.lat, loc.long, loc.land, loc.provincie, loc.gemeente, loc.plaats 
FROM     vj_location AS loc 
WHERE    (loc.lat != '0' AND loc.long != '0') AND loc.land = 'Nederland' AND loc.gemeente = '' AND loc. plaats = ''
GROUP BY loc.provincie 
ORDER BY loc.land, loc.provincie, loc.gemeente, loc.plaats DESC

Wich 会给我这些结果:

loc_id  lat         long        land        provincie       gemeente    plaats
19      52.132633   5.291266    Nederland            
697     52.9476012  6.6230586   Nederland   Drenthe      
1257    52.5279781  5.5953508   Nederland   Flevoland        
401     53.1641642  5.7817542   Nederland   Friesland        
235     52.045155   5.8718234   Nederland   Gelderland       
2732    53.2887213  6.7060867   Nederland   Groningen        
860     51.4427238  6.0608726   Nederland   Limburg      
255     51.4826537  5.2321687   Nederland   Noord-Brabant        
407     52.5205869  4.788474    Nederland   Noord-Holland        
884     52.4387814  6.5016411   Nederland   Overijssel       
3796    52.119508   5.1943653   Nederland   Utrecht      
3692    51.325362   3.6640464   Nederland   Zeeland      
705     52.0207975  4.4937836   Nederland   Zuid-Holland

我需要将这些组合到一个查询中,其中包含第一个查询的结果和组以及第二个查询的纬度和经度。有人可以帮忙吗?

提前致谢

编辑: 我尝试使用 UNION 但它返回错误: 1222 - 使用的 SELECT 语句有不同的列数

我尝试使用子查询,但它会减慢查询速度。现在运行查询需要很长时间

第二次编辑:感谢@johntotetwoo,我编辑了联合查询以使其工作。 我不得不删除订单,因为我的 mysql 不喜欢这样,实际上不需要它是为了调试时的可读性。 我还更改了第二个查询中选择的顺序,以便将零放在右列。

新查询

SELECT *
FROM
    (SELECT   loc.location_id as loc_id, loc.lat, loc.long, count(res.unique_id) as aantal, loc.land, loc.provincie, loc.gemeente, loc.plaats 
    FROM     `vj_results_1618048029` AS res, vj_location AS loc 
    WHERE    res.time > '1324635105' AND res.time < '1327313506' AND res.search_id='8070' AND (loc.lat != '0' AND loc.long != '0') AND res.location_id != '' AND res.location_id = loc.location_id  AND loc.land = 'Nederland'
    GROUP BY loc.provincie
           UNION
    SELECT   location_id as loc_id, loc.lat, loc.long, 0 as aantal, loc.land, loc.provincie, loc.gemeente, loc.plaats 
    FROM     vj_location AS loc 
    WHERE    (loc.lat != '0' AND loc.long != '0') AND loc.land = 'Nederland' AND loc.gemeente = '' AND loc. plaats = ''
    GROUP BY loc.provincie) as iTable

现在很好用,谢谢! 我只是想知道它是否可以合并为 1 行(我现在有一排有结果和省份的编号,另一行有相同的省份和正确的经度和纬度。)如果这些可以合并,那就是完全完美!

【问题讨论】:

    标签: mysql subquery union


    【解决方案1】:

    将字段 aantal 添加到第二个查询并重新联合

    【讨论】:

      【解决方案2】:

      因为第二个查询没有aantal 列。

      试试这个:

      SELECT *
      FROM
          (SELECT   loc.location_id as loc_id, loc.lat, loc.long, count(res.unique_id) as aantal, loc.land, loc.provincie, loc.gemeente, loc.plaats 
          FROM     `vj_results_1618048029` AS res, vj_location AS loc 
          WHERE    res.time > '1324635105' AND res.time < '1327313506' AND res.search_id='8070' AND (loc.lat != '0' AND loc.long != '0') AND res.location_id != '' AND res.location_id = loc.location_id  AND loc.land = 'Nederland'
          GROUP BY loc.provincie 
          ORDER BY loc.land, loc.provincie, loc.gemeente, loc.plaats DESC
                 UNION
          SELECT   location_id as loc_id, loc.lat, loc.long, loc.land, loc.provincie, loc.gemeente, loc.plaats , 0 as aantal
          FROM     vj_location AS loc 
          WHERE    (loc.lat != '0' AND loc.long != '0') AND loc.land = 'Nederland' AND loc.gemeente = '' AND loc. plaats = ''
          GROUP BY loc.provincie 
          ORDER BY loc.land, loc.provincie, loc.gemeente, loc.plaats DESC) as iTable
      

      【讨论】:

      • 现在很好用,谢谢!我只是想知道它是否可以合并为 1 行(我现在有一排有结果和省份的编号,另一行有相同的省份和正确的经度和纬度。)如果这些可以合并,那就是完全完美!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多