2

Id、個人名、および関連する売上高の 3 つの列を含む単純なデータのテーブルがあります。売上高でランク付けされたときに上下の行を返す方法がわかりません。

id | Name | Sales
---|------|------
0  | Tim  | 9
1  | Jim  | 5
2  | Joe  | 3
3  | Ryan | 6
4  | Phil | 7
5  | James| 1

たとえば、Ryan というユーザーの売上合計は 6 です。Jim の売上は 5 で、彼より下の [Ryan] と、彼より上の Phil の [Ryan] を 7 で返すにはどうすればよいでしょうか。いくつかのクエリを試してみました。そしてそれを2つに分割することさえ。クエリを使用すると、次の結果が出力されます。

id | Name | Sales
---|------|------
4  | Phil | 7
3  | Ryan | 6
1  | Jim  | 5



select * from SalesFigures where id >= '3' LIMIT 2 ORDER BY Sales ASC

このエラーは、理論的には、クエリされた行とその下の行のみを返します。

この結果はどのように達成されますか? 売上高で注文できないようです。

ありがとう。

4

2 に答える 2

1

I would use something like this:

SELECT SalesFigures.*
FROM
  SalesFigures INNER JOIN (
  SELECT s1.Sales v1, MAX(s2.Sales) v2, MIN(s3.Sales) v3
  FROM
    SalesFigures s1 LEFT JOIN SalesFigures s2
    ON s1.Sales > s2.Sales
    LEFT JOIN SalesFigures s3
    ON s1.Sales < s3.Sales
  WHERE
    s1.ID =3) m ON SalesFigures.Sales IN (m.v1, m.v2, m.v3)

Using a UNION query will look something like this:

SELECT SalesFigures.*
FROM SalesFigures WHERE ID=3
UNION ALL
(SELECT SalesFigures.*
 FROM SalesFigures INNER JOIN SalesFigures s
      ON SalesFigures.Sales < s.Sales
 WHERE s.ID = 3
 ORDER BY SalesFigures.Sales DESC LIMIT 1)
UNION ALL
(SELECT SalesFigures.*
 FROM SalesFigures INNER JOIN SalesFigures s
      ON SalesFigures.Sales > s.Sales
 WHERE s.ID = 3
 ORDER BY SalesFigures.Sales LIMIT 1)

But while this will work on sample data, if there are multiple rows with the same Sales value it will return only one.

于 2013-04-14T00:02:23.833 に答える
1

まず、LIMIT句が句の後に来る必要があるため、エラーが発生しますORDER BY。あなたの例では、それらは間違った方法ですが、SQL の句の順序は重要です。

UNION を使用すると、次のようになります。

(SELECT id, name, sales
FROM salesfigures
WHERE sales = (SELECT MIN(sales) FROM salesfigures 
   WHERE sales > (SELECT sales FROM salesfigures where id=3)))
UNION
(SELECT id, name, sales
FROM salesfigures
WHERE sales = (SELECT sales FROM salesfigures WHERE id=3))
UNION
(SELECT id, name, sales
FROM salesfigures
WHERE sales = (SELECT MAX(sales) FROM salesfigures 
   WHERE sales < (SELECT sales FROM salesfigures where id=3)))

ネストされた subselect ステートメントはやや醜いですが、3 つの select ステートメントを組み合わせて、ID が 3 のユーザーよりも売上高がすぐ大きく、それよりも小さいものを見つけます。

最初のステートメントで、ID 3 (Ryan) の売上高を見つけ、次にこれを SELECT ステートメントで使用して、それより高い最小値を見つけます。次に、SELECT ステートメントで使用して、その売上高を持つすべての全体を返します。3 番目のステートメントは明らかに逆です (Ryan の最大値を下回る)。中間のステートメントは、ID 3 (Ryan) の売上高を単純に検索し、同じものをすべて返します。ユニオン内のステートメントの順序は、例に従って降順でソートされることを意味します。ただし、売上高が一意でない場合は、次のようなものが返される可能性があります。

id | Name   | Sales
---|--------|------
12 | George | 7
4  | Phil   | 7
9  | Pat    | 6
23 | Tony   | 6
3  | Ryan   | 6
1  | Jim    | 5

売上高が一意ではない状況をどのように処理したいか、およびそれらをどのように二次ソートしたいかによって異なります。

于 2013-04-14T01:37:37.877 に答える