我难以对多个查询的结果进行排序。我正在运行的查询返回一个以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)
答案 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
提供总计。