优化查询(排序)

时间:2018-02-05 21:21:46

标签: mysql

我想优化一个很长的查询,但我找不到这样做的方法。

可以说你有一个名为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

2 个答案:

答案 0 :(得分:1)

这应该这样做:

SQL Fiddle

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

http://sqlfiddle.com/#!9/4c8786/1