2017-04-12 3 views
0

行のセットを返すクエリがあります。私はLIMITに、範囲の先頭または末尾のどちらかに相対して、これらの行のいくつかのサブセットに実際に何が返されるのかを知りたいと思います。範囲が初めとの相対的なものであれば、これを簡単に行うことができます。例えば、私は私が行うことができます行5-7を返したい場合:MySQLの行の範囲を結果セットの先頭または末尾に戻します

SELECT * FROM <table> WHERE <condition> ORDER BY rowid ASC LIMIT 5,2 

私が行う必要がある唯一の翻訳は、(index0,index1)からoffset,lengthどこoffset=index0length=index1-index0にあります。

しかし、1つのクエリで範囲の終わりを基準にして範囲を指定できるようにしようとしています。つまり、最初にクエリを実行して行数を決定し、次にこの情報に基づいて2番目のクエリを実行しません。たとえば、(-5,-1)の行範囲を指定すると、これは最後の5行が返されることを意味します。私はLIMITに負の値を渡すことはできません。

類似の質問を読む際に、1つの提案された解決策がクエリのORDERを変更するように思われました。だから私はできると思う:

SELECT * FROM <table> WHERE <condition> ORDER BY rowid DESC LIMIT 1,5 

今私は2つの問題があります。最初に、返されたセットの順序が間違っていますが、私はまだそれを昇順で返します。だから今私はすべての順序を変更するには、サブクエリを持っている必要があります:それよりも、それを行うには良い方法があるかどう

SELECT * FROM (SELECT * FROM <table> WHERE <condition> ORDER BY rowid DESC LIMIT 1,5) AS x ORDER BY x.rowid ASC; 

は私はわからないんだけど、第二の問題があります:これは、開始場合は動作しません。範囲の終わり部分は、相対的なものとして混在しています。 10番目から最後までのすべての行である範囲(10,-2)を返すとします。この場合、上記のアプローチのどちらも機能しません。

また、使用方法の例SQLはありませんが、mysql_num_rows()mentionedでした。

SELECT * FROM <table> WHERE <condition> ORDER BY rowid DESC LIMIT 10,mysql_num_rows()-2; 

しかし、私はこのクエリを実行しようとすると、私はこのエラーを取得する:

ERROR 1327 (42000): Undeclared variable: mysql_num_rows 
+0

mysql_関数は償却されます。代わりにmysqli_を使用してください。 –

+0

@SloanThrasher 'ERROR 1327(42000):宣言されていない変数:mysqli_num_rows' – Michael

+0

http://php.net/manual/en/mysqli-result.num-rows.php - 単純なGoogle検索を1回実行しました。 –

答えて

2

何あなたのアプローチを逆転について?範囲(10, -2)の行を要求すると、「最初の9行と最後の行を除くすべて」という意味です。

編集

select * from yourTable order by rowid asc 
minus 
select * fom yourTable order by rowid asc limit 9 
minus 
select * fom yourTable order by rowid desc limit 1 

に翻訳することができます

MySQLはMINUSをサポートしていないので、上記のクエリはこれが基づいて代わりに

select t1.* 
from yourTable t1 
left join 
     (select rowid fom yourTable order by rowid asc limit 9) t2 
on  t1.rowid = t2.rowid 
left join 
     (select rowid fom yourTable order by rowid desc limit 1) t3 
on  t1.rowid = t3.id 
where t2.rowid is null and t3.rowid is null 
order by t1.rowid asc 
+0

Argh ... [MySQLはMINUSをサポートしていません](https://stackoverflow.com/questions/12128844/minus-operator-giving-me-erros-in-mysql)... – Michael

+0

申し訳ありませんが、正直言って私はそれについても考えていませんでした。 MySQLで動作するソリューションで私の答えを編集しました。 –

0

left joinを使用して書き換えることができこの質問に与えられた別の答えは、MINUS。残念ながら、MySQLはこの演算子をサポートしていません。私は代わりにNOT INを使用しました。さらに、INサブクエリにLIMITがサポートされていないというMySQLの問題を回避するために、追加のクエリ内にクエリをラップする必要がありました。

したがって、もう一つの答えによって提供される解決策の前提は、正の開始インデックスと負の終了インデックスを両方とも陰性または陽性の両方の指標とは異なる場合として扱うことです。次に、すべてを選択しますが、開始時と終了時に範囲を除外します。 (10,-2)の例示的範囲で動作し、MySQLが好きと実際のコードは次のとおり

SELECT * 
FROM <table> 
WHERE <conditions> 
AND rowid NOT IN 
(
    SELECT * FROM (
     SELECT rowid FROM <table> WHERE <conditions> ORDER BY rowid ASC LIMIT 9 
    ) 
) 
AND rowid NOT IN 
(
    SELECT * FROM (
     SELECT rowid FROM <table> WHERE <conditions> ORDER BY rowid DESC LIMIT 1 
    ) 
) 

以上概して、I0> = 0およびI1 < 0、-i1-1i0-191を置き換える範囲(i0,i1)ため。もちろん、これらの値のいずれかが1未満の場合、クエリのその部分は除外できます。

関連する問題