2

「同一」のクエリを使用する必要があります。ただし、1つのクエリではテーブルから1つの列のみを取得し、もう1つのクエリでは同じテーブルから複数の列を取得します。それ以外はすべて同じです。何らかの理由で、2つのクエリの結果の順序は完全に同じではありません。どうすればいいの?

これらは2つのクエリです。

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

そして、scondクエリは次を返します。

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

ご覧のとおり、順序は同じではありません...

4

1 に答える 1

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の値が同じであることがわかります。そのため、2番目のORDER BY基準がないと、順序が一貫しない場合があります。ORDER BY orderColumn, bruker_id

2番目のクエリを使用すると、

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_id645と271の両方のorderColumn値は28になります。

于 2012-04-17T10:35:49.277 に答える