所选列是否会影响MySQL结果中的行顺序?

时间:2012-04-17 10:24:09

标签: mysql select

我必须进行“相同”的查询,除了在一个查询中我只从表中检索一列,而在另一个查询中,我从同一个表中检索多个列。否则一切都是一样的。出于某种原因,两个查询的结果中的顺序并不完全相同。怎么会这样?

这是两个问题:

SELECT b.bruker_id, b.poeng_j + b.poeng_ss + b.poeng_u + b.poeng_n + b.poeng_s + b.poeng_f + b.poeng_v AS orderColumn
FROM brukere b
JOIN soknad s ON b.bruker_id = s.bruker_id
WHERE s.t_start_y =2013
AND s.t_start_s =0
AND YEAR( NOW( ) ) - b.aar >30
AND YEAR( NOW( ) ) - b.aar <40
ORDER BY orderColumn DESC 
LIMIT 10 ;

SELECT b.bruker_id, b.poeng_j + b.poeng_ss + b.poeng_u + b.poeng_n + b.poeng_s + b.poeng_f + b.poeng_v AS orderColumn, b.etternavn, b.fornavn, YEAR( NOW( ) ) - b.aar AS alder, b.poeng_j, b.poeng_ss, b.poeng_u, b.poeng_n, b.poeng_s, b.poeng_f, b.poeng_v, b.kjonn
FROM brukere b
JOIN soknad s ON b.bruker_id = s.bruker_id
WHERE s.t_start_y =2013
AND s.t_start_s =0
AND YEAR( NOW( ) ) - b.aar >30
AND YEAR( NOW( ) ) - b.aar <40
ORDER BY orderColumn DESC 
LIMIT 10 ;

第一个查询返回:

+-----------+-------------+
| bruker_id | orderColumn |
+-----------+-------------+
|        92 |          29 |
|       271 |          28 |
|       645 |          28 |
|       323 |          27 |
|       487 |          27 |
|        58 |          27 |
|        76 |          27 |
|       289 |          26 |
|       759 |          26 |
|       128 |          26 |
+-----------+-------------+

第二个查询返回:

+-----------+-------------+-----------+----------+-------+------------+------------------+------------------+-------------+-----------+-----------------+------------+-------+
| bruker_id | orderColumn | etternavn | fornavn  | alder | poeng_j | poeng_ss | poeng_u | poeng_n | poeng_s | poeng_f | poeng_v | kjonn |
+-----------+-------------+-----------+----------+-------+------------+------------------+------------------+-------------+-----------+-----------------+------------+-------+
|        92 |          29 | Tonheim   | Kine     |    33 |          4 |               16 |                3 |           0 |         0 |               6 |          0 |     1 |
|       645 |          28 | Saue      | Laila    |    36 |          8 |               16 |                0 |           0 |         0 |               4 |          0 |     1 |
|       271 |          28 | Grønnevik | Karl     |    38 |          8 |               16 |                0 |           0 |         0 |               4 |          0 |     0 |
|        76 |          27 | Tornes    | Kristina |    39 |          5 |               16 |                0 |           0 |         0 |               6 |          0 |     1 |
|       487 |          27 | Smestad   | Tonje    |    34 |          8 |               16 |                0 |           0 |         0 |               0 |          3 |     1 |
|        58 |          27 | Torjussen | Linn     |    35 |          8 |               16 |                0 |           0 |         0 |               0 |          3 |     1 |
|       323 |          27 | Gillebo   | Tore     |    31 |          5 |               16 |                0 |           0 |         0 |               6 |          0 |     0 |
|       759 |          26 | Sætren    | Grete    |    36 |          4 |               16 |                0 |           0 |         0 |               6 |          0 |     1 |
|       289 |          26 | Gjersøe   | Torbjørn |    37 |          4 |               16 |                0 |           0 |         0 |               6 |          0 |     0 |
|       339 |          26 | Gjøen     | Fredrik  |    34 |          4 |               16 |                0 |           0 |         0 |               6 |          0 |     0 |
+-----------+-------------+-----------+----------+-------+------------+------------------+------------------+-------------+-----------+-----------------+------------+-------+

如您所见,订单不一样......

1 个答案:

答案 0 :(得分:2)

如果您为每个SELECT首先添加一列

b.poeng_j + b.poeng_ss + b.poeng_u + b.poeng_n + b.poeng_s + b.poeng_f + b.poeng_v AS orderColumn

然后将查询更改为ORDER BY orderColumn

然后,您将能够清楚地看到它所订购的。然后,您可能会看到某些行在orderColumn中具有相同的值,因此如果没有第二个ORDER BY条件,则排序可能不一致,即ORDER BY orderColumn, bruker_id

使用您的第二个查询我最终会

SELECT 
    b.bruker_id, 
    b.etternavn, 
    b.fornavn, 
    YEAR( NOW( ) ) - b.aar AS alder, 
    b.poeng_j, b.poeng_ss, 
    b.poeng_u, 
    b.poeng_n, b.poeng_s, 
    b.poeng_f, 
    b.poeng_v, 
    b.kjonn,
    (b.poeng_j + b.poeng_ss + b.poeng_u + b.poeng_n + b.poeng_s + b.poeng_f + b.poeng_v) AS orderColumn
FROM brukere b
JOIN soknad s ON b.bruker_id = s.bruker_id
WHERE s.t_start_y =2013
    AND s.t_start_s =0
    AND YEAR( NOW( ) ) - b.aar >30
    AND YEAR( NOW( ) ) - b.aar <40
ORDER BY orderColumn DESC, b.bruker_id ASC 
LIMIT 10 ;

在您的示例数据中,bruker_id 645和271的orderColumn值均为28。