2017-11-09 3 views
0

で私はPROCEDUREでのMySQLを作成したいときは、常にテーブル未満xのエントリを持っている場合でも、テーブルからx行を戻すことやり直すを選択します。は常に、表から行をXと最後

ので、同じように:

+----+-------+ 
| id | value | CALL myProcedure USING(4); 
+----+-------+ returns → a b c a 
| 1 | a |  
| 2 | b |  
| 3 | c | 
+----+-------+ 

は、内部的には私が最後の返された行を保存する(この場合には、それは'a'だろう)、次に手順は、そこから継続すべき呼び出す:

1st: CALL myProcedure USING(4) → a b c a 
2nd: CALL myProcedure USING(3) → b c a 
3rd: CALL myProcedure USING(7) → b c a b c a b 
4th: CALL myProcedure USING(2) →  c a  

I UNIONで試してみました。これはx = 7の3番目の呼び出しが次のようになります。

(
SELECT `value` 
    FROM `table` 
    LIMIT 1,7 
) 
UNION 
(
SELECT `value` 
    FROM `table` 
    LIMIT 4 
) 

「(7まで)私の行をすることができますようにできるだけ多くを与えてやり直すと私の残りの部分(7 - 以前の行数= 4)を得た後、行1
後に開始する。」

を最初の選択はb cを返し、2番目の選択はa b cを返します。どちらも一緒に選択すると、b c aが返されます。今、私はこれらの問題直面しています

1)UNIONは二回(私はコール上からになるだろう、すべてがb c aだろう)

2)で同じ行を返しません私はテーブルを2回ループすることができます。なぜなら、1つの共用体しかないので、より多くの共用体を動的に追加する方法がないからです。したがって、重複する行を取得できたとしても、それはb c a b cになり、残りのa bは不足しています。

テーブルを何度も "ループ"できますか?UNIONより優れたものはありますか? (私の問題を解決した後)

EDIT 私は、行の返された数が予想よりも小さい場合は、データベースの外部結果セットをループにcf_en's propositionを追いました。他のすべてのケース(1回の反復のみが必要なケース)は、手順(単純なUNIONを使用)によってカバーされます。

+0

ユニオンが重複を削除するのを止めるには、 'UNION ALL'を使うことができます。しかし、データベースがループするのに最適な場所かどうかは不思議です。代わりにこのロジックを呼び出しコードに実装できますか? –

+0

:)素晴らしい、 'UNION ALL'について知りませんでした。これで、少なくとも2回ループします。コールコードが、返されたすべての期待された結果ではないことを検出した場合、補足呼び出しを行うことを考えていました。私はデータベースへの往復の回数を減らし、ロジックを1か所にまとめたいと思っていますが、 – GameDroids

+0

私は、データベースからユニークなデータ行を取得して、代わりに呼び出しコード内のすべてのループロジックを処理できることを意味しました。 –

答えて

0

UNION ALLを使用すると、重複を削除できなくなります。しかし、データベースがループするのに最適な場所かどうかは不思議です。別の行をデータベースから戻して、代わりに呼び出しコードにループロジックを実装できますか?

関連する問題