2012-03-19 6 views
2

私はテーブルの最初の30行を選択:MySQLの最後のn行を選択するには?このコードで

SELECT * FROM `table` LIMIT 0 , 30 

をしかし、どのように順序を変更せずに、最後の30を選択するには?

+2

ここでは、任意の順序を持​​っていません。 –

+2

テーブルには、データを並べるために使用できるフィールドがありますか?おそらくTIMESTAMP列または自動増分INT列? –

答えて

10

誰もが、この部分が欠落しているように見えます:

しかし、どのように、最後の30を選択するには、順序を変更せずに?

まず、提供されたクエリには順序がありません。順序は、いくつかのフィールドに昇順され、これは@DannyFoxを意味し、クエリだろうと仮定:

SELECT * FROM T 
ORDER BY val 
LIMIT 3 

SELECT * FROM T 
ORDER BY val 
LIMIT 0 , 30 

は、今、私たちは、このようなa, b, c, d, eなどのデータを、簡素化され、我々はわずか3行の代わりに、30をしたいことをしていると想像

これが返された場合:a, b, c, d, e各行には、その後、彼はその順序でc, d, eを得ることを期待します。誰もが提供しているクエリ:

SELECT * FROM T 
ORDER BY val desc 
LIMIT 3 

返されるのはe, d, cです。この問題は、実際に元の注文を変更していることであり、OPは注文を変更したくないと言います。だから、技術的には、c, d, eにつながるクエリは次のとおりです。実際には、元の順序を取得し、二度の順序を変更する

select * from (
    select * from t 
    order by val desc 
    limit 3 
) s 
order by val 

+0

私はあなたにそれを打つように見えるが、私のように考えて+1する。 :) – Shef

+0

LOL、+1もあなたのために:) –

1

多分これは動作します:select * from table WHERE id > ((SELECT MAX(id) from table) - 30);

+1

最後の30個のレコードの一部が削除され、そのIDが自動インクリメンタルである場合、30個未満の結果が得られます。 –

+4

ええ、それはおそらく大きなものです。特にIDの間に隙間があるとします。 'ORDER BY'節はプロ解決策であり、それ以上のことはありません。 – Shef

+2

この回答は、テーブルの構成について多くのことを前提としています。 –

3

あなたが自動増分キー/列を持っている場合は、idはその後、ここにあなたが順序を指定する必要があります例

SELECT * FROM `table` ORDER BY id DESC LIMIT 0 , 30; 
4

初だと言う:

SELECT * FROM table 
ORDER BY some_id ASC -- ascending order 
LIMIT 30 

このクエリで最初の30個の列が返された場合、最後の30個の列が返されます。

SELECT * FROM table 
ORDER BY some_id DESC -- descending order 
LIMIT 30 
7

あなたが発注を避けるためにしようとしているので、その解決策は、それを2回適用することであろう。

SELECT * 
    FROM (
      SELECT * 
       FROM `table_name` 
      ORDER BY `column_name` DESC -- maybe id? 
      LIMIT 0, 30 
     ) `table_aliase` 
ORDER BY `column_name` ASC 
0

オーダーについては何も言われていないので、ORDER BYは使用できません。 あり与えられた点からレコードを取得する方法ですが、そのためにあなたは、その後、私の方法は、PHPで使用しています制限

ここ
SELECT COUNT(*) AS counted FROM table 

SELECT * FROM table LIMIT (counted-30),30 
0

を提供するために、このカウント値が使用されているレコード数を知っておく必要があります。

$query = "SELECT * FROM table ORDER BY id DESC LIMIT 3"; 
$res = mysql_query($query); 
$results = array(); 
while($row = mysql_fetch_assoc($res)){ 
    $results = $row[field]; 
} 
// Back to original order based from DB 
$results = array_reverse(results); 
関連する問題