12

それで、

問題

私の質問は、MySQL のテーブルをそれ自体と逆の順序で結合する方法についてです。私が持っているとします:

ID名
1 ファースト
2秒
5 サード
6 フォース
7 フィフス
8 シックス
9 セブンス
13 エイト
14 ナイン
15 10分の1

-次に、結合されたレコードを逆順で返すクエリを作成したいと思います。

left_id 名 right_id 名
   1 ファースト 15 10 分の 1
   2 秒 14 9
   5 サード 13 エイト
   6 4 番目 9 7 番目
   7 5 番目 8 6 番目
   8 6 番目 7 5 番目
   9 7 番目 6 4 番目
  13 エイト 5 サード
  14 ナイン 2 秒
  15 10位 1位

私のアプローチ

私は今、このクエリを持っています:

SELECT 
  l.id AS left_id, 
  l.name, 
  (SELECT COUNT(1) FROM sequences WHERE id<=left_id) AS left_order, 
  r.id AS right_id,
  r.name,
  (SELECT COUNT(1) FROM sequences WHERE id<=right_id) AS right_order 
FROM 
  sequences AS l 
  LEFT JOIN 
    sequences AS r ON 1
HAVING
  left_order+right_order=(1+(SELECT COUNT(1) FROM sequences));

-サンプル構造とコードについては、このフィドルを参照してください。

いくつかの背景

そのためのユースケースはありません。私は前にアプリケーションでそれをやっていました。SQLでそれを行う方法があるかどうかは、今ではほとんど好奇心です. ソーステーブルは常に小さい (<10.000 レコード) ため、パフォーマンスは気にする必要はないと思います。

質問

クエリを何らかの形で単純化できますか? また、変数を使用しないことも重要です。(私のフィドルのように)結果に注文を含めることができますが、それは必須ではありません。

4

3 に答える 3

2

私が改善できると思う唯一のことは、

SELECT 
  l.id AS left_id, 
  l.name ln, 
  (SELECT COUNT(1) FROM sequences WHERE id<=left_id) AS left_order, 
  r.id AS right_id,
  r.name rn,
  (SELECT COUNT(1) FROM sequences WHERE id>=right_id) AS right_order 
FROM 
  sequences AS l 
  LEFT JOIN 
    sequences AS r ON 1
HAVING
  left_order=right_order;

これを少し速くするための 2 つの変更があります。

1) そもそも逆順で正しい順序を計算する

SELECT COUNT2)最後の行での使用は避けてください。

編集:フィドルで列が見えなかったため、ln、rnにエイリアスを付けました

于 2013-10-01T11:43:58.777 に答える
0
SET @rank1=0;
SET @rank2=0;

SELECT *
FROM (SELECT *, @rank1 := @rank1 + 1 AS row_number FROM sequences ORDER BY ID ASC) t1
INNER JOIN (SELECT *, @rank2 := @rank2 + 1 AS row_number FROM sequences ORDER BY ID DESC) t2
on t1.row_number = t2.row_number

何らかの理由で、SQL フィドラーはこれに対して 3 つの列しか表示しません。クエリが悪いかどうかはわかりません。

于 2013-10-01T11:10:24.543 に答える