我想优化一个很长的查询,但我找不到这样做的方法。
可以说你有一个名为Results_Race的表,这个表的列是:
<I filled it with some sample data to make it more clear>
----------------------------------
|Driver name| Position | Race id |
----------------------------------
|Hamilton | 1 | 00001 |
|Hamilton | 2 | 00002 |
|Alonso | 1 | 00002 |
|Alonso | 2 | 00001 |
| ... | ... | ... |
----------------------------------
驱动程序名称为varchar,位置为数字,种族ID也为数字
假设您需要根据他们的结束位置对所有驱动程序进行排序,因此排序后的第一个飞行员将是拥有最多第一名的人。如果平局,汉密尔顿和阿隆索都有五个第一名(在职位栏下给出),你需要评估谁拥有最多的第二名,但想象那里也有抽奖,然后我们评估两者中谁大多数第三名,等等...
我认为这是可能的,我只是想弄明白,任何人都可以对此有所了解吗?
顺便说一下,我当前的查询很乱,总结一下这就是我的查询:
LEFT JOIN (SELECT COUNT(*) AS POS1,V.DRIVER DV FROM RESULTS_RACE V WHERE V.POSITION=1 GROUP BY DV) G1 ON (G1.DV=A.DRIVER)
LEFT JOIN (SELECT COUNT(*) AS POS2,V.DRIVER DV FROM RESULTS_RACE V WHERE V.POSITION=2 GROUP BY DV) G2 ON (G2.DV=A.DRIVER)
。 。
POS1是第一名的数量 POS2是第二名的数量 等等 司机是飞行员的名字
我有34个这样的查询,每个位置一个,然后最后我有一个订单,通过它对驱动程序进行适当的排序:
ORDER BY POS1 DESC,POS2 DESC, ... ,POS34 DESC
答案 0 :(得分:1)
这应该这样做:
MySQL 5.6架构设置:
查询1 :
SELECT
Driver_name,
SUM(IF(Position = 1,1,0)) POS1,
SUM(IF(Position = 2,1,0)) POS2,
SUM(IF(Position = 3,1,0)) POS3
FROM X
GROUP BY
Driver_name
ORDER BY
POS1 DESC,
POS2 DESC,
POS3 DESC
<强> Results 强>:
| Driver_name | POS1 | POS2 | POS3 |
|-------------|------|------|------|
| Hamilton | 2 | 2 | 0 |
| Alonso | 1 | 2 | 1 |
答案 1 :(得分:0)
这个位置使用未定义的位置数:
select driver_name, group_concat(lpad(c, 10, 0) order by position) order_col
from (
select driver_name, position, count(r.position) as c
from (select distinct driver_name from result_race) d
cross join (select distinct position from result_race) p
left join result_race r using(driver_name, position)
group by d.driver_name, p.position
) sub
group by driver_name
order by group_concat(lpad(c, 10, 0) order by position) desc