SQL排序来自多个结果的索引和通过添加对应于同一个键的索引

时间:2017-11-30 22:41:41

标签: mysql sql

我难以对多个查询的结果进行排序。我正在运行的查询返回一个以zipcode为键的排序列表。因此,例如,1个查询将返回犯罪率低的已排序的zipcodes,最低的zipcode具有1作为其索引,然后是返回zipcodes的查询,其中平均工资超过100k或更少,最接近100k是索引1。

假设我有6个或更多类似的查询。然后,我如何通过所有查询的索引总和对zipcodes进行排序?

运行示例查询:

SELECT DISTINCT s1.Zip_Code, s1.Median_Value
FROM NJ_Housing_Expenses s1, NJ_Housing_Expenses s2
WHERE s1.Median_Value < 100000 AND s1.Zip_Code NOT IN (
SELECT Zip_Code
FROM NJ_Housing_Expenses
WHERE Median_Value = 0
)
ORDER BY Median_Value DESC

SELECT City, (((Violent_Crime*4) + Property_Crime)/Population) as CrimeSum
From NJ_Crime_Statistics
where Date = 2016
Group By City
Order by CrimeSum ASC

输出

1 08754   
2 08234
3 07332
4 09563

然后

1 08754
2 07332
3 09563
4 08234 

然后通过添加索引

进行排序
1 08754 (2)
2 07332 (5)
3 08234 (6)
4 09563 (7)

1 个答案:

答案 0 :(得分:1)

听起来你想要“编号”每个查询中的行。我们可以使用MySQL用户定义的变量来做到这一点。

我们可以在parens中包装一个合适的查询,并将其作为内联视图(代替表)引用。作为示范。

SELECT q1.Zip_code
     , @q1_rn := @q1_rn + 1   AS rn 
  FROM ( SELECT @q1_rn := 0 ) i 
 CROSS
  JOIN (
         -- source query here as inline view
         SELECT s1.Zip_Code
              , ...
           FROM ...
          ORDER BY Median_Value DESC
       ) q1
 ORDER BY q1.Median_Value DESC

我们可以为另一个查询做同样的事情,但使用不同的用户定义变量

SELECT q2.Zip_code
     , @q2_rn := @q2_rn + 1   AS rn
  FROM ( SELECT @q2_rn := 0 ) i 
 CROSS
  JOIN (
         -- inline view query here
       ) q2
 ORDER BY q2.CrimeSum ASC

我们可以将这些查询的结果与UNION ALL集合运算符结合起来,并将整个事物引用为内联视图,

 SELECT t.Zip_code 
      , SUM(t.rn)   AS tot_rn
   FROM (
           (  
              -- first query from above goes here
           )
           UNION ALL
           (
              -- second query from above goes here
           )
           UNION ALL
           (
              -- third query
           )
           UNION ALL
           (
              -- fourth query
           )
        ) t
  GROUP BY t.Zip_code
  ORDER BY tot_rn ASC

添加GROUP BY以折叠所有具有相同Zip_Code的行(每个源查询返回的第一列...每个查询应该返回两列...... {{ 1}}和Zip_code

我们使用rn汇总来累计SUM()的值,为每个rn提供总计。