mysql - 所选列会影响 MySQL 结果中的行顺序吗?

标签 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 |
+-----------+-------------+-----------+----------+-------+------------+------------------+------------------+-------------+-----------+-----------------+------------+-------+

如你所见,顺序不一样...

最佳答案

如果先向每个 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。

关于mysql - 所选列会影响 MySQL 结果中的行顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10189409/

相关文章:

php - 使用 LEFT JOIN 时限制特定表上的结果

php - 我如何按优先级 ID 列表对 mysql 结果进行排序?

php - 如果网站关闭,则返回并终止 session

mysql - 从 LEFT OUTER JOIN 计算 NULL 值,这可能吗?

mysql - 我可以使用 "last update"时间戳来选择要更新的 MySQL 记录吗?

c# - 将外键添加到其他表或在选择查询中创建平面表的速度更快

mysql - 如何将 WHERE 子句的多个值作为单个参数传递

javascript 选择要包含的元素

php - 将数据从数据库中吐出到选择字段

mysql - 头脑 NumPy 的 SQL 疯狂