2016-07-27 1 views
4

で変数Iが2列から基準を取得しようとMYSQLインデックスクエリ

$query1 = "SET @row_num = 0"; 
$query2 = "SELECT *, @row_num := @row_num + 1 as row_index FROM gift 
      WHERE Category = '0' AND ID ='".$ID."' 
      ORDER BY ID ASC;"; 
mysqli_query($conn, $query1); 

$retrieve = mysqli_query($conn, $query2); 

このクエリを使用してインデックスを作成していますが、私は変数としてROW_INDEXを使用することができる方法があるとされますクエリで、次のように:実際にそれをテストしなくても、

$query1 = "SET @row_num = 0"; 
$query2 = "SELECT *, @row_num := @row_num + 1 as row_index FROM gift 
      WHERE Category = '0' AND row_index ='".$ID."' 
      ORDER BY ID ASC;"; 
mysqli_query($conn, $query1); 

$retrieve = mysqli_query($conn, $query2); 
+0

なぜ、これらすべての@s? –

+0

変数@row_numは、row_index列の各行を1ずつインクリメントするために使用されます。 –

+0

'row_index = @ row_num'? – bishop

答えて

3

あなたはHAVING句で$IDのためにテストすることができます。

$query1 = "SET @row_num = 0"; 
$query2 = "SELECT *, @row_num := @row_num + 1 as row_index FROM gift 
      WHERE Category = '0' 
      HAVING row_index = $ID 
      ORDER BY ID ASC;"; 
mysqli_query($conn, $query1); 

$retrieve = mysqli_query($conn, $query2); 

クエリ内の変数を連結する必要はありません。 $IDが整数の場合、引用符は必要ありません。英数字の場合は、PHPが変数を正しく補間するため、一重引用符で囲みます。


Reference for HAVING clause

+0

ありがとう、それは私のために完全に働いた。 –

+0

喜んで@ user6645308 –

+0

'ORDER BY'はおそらく必要ありません。 –

0

、私は仕事に、次のようなものを期待....

SELECT ilv.* 
FROM (
    SELECT gift.*, @row_num := @row_num + 1 as row_index 
    FROM gift 
    WHERE Category = '0' 
    ORDER BY ID ASC 
) ilv 
WHERE row_index ='".$ID."'; 

(ただし、整数値は引用しないでください)。

それとも....のMyISAMエンジンを使用して

SELECT * 
FROM gift 
WHERE Category = '0' 
ORDER BY ID ASC 
LIMIT $ID, 1; 

それとも、最近のMySQLで、次のことができdefine a primary key based on a natural key and autoincrement value。あなたの場合、「自然な」キーはカテゴリになります。そして、あなたが単調間隔でデータベースに保存された ID を割り当てるとしていることを確認した場合、単純に.....

SELECT * 
FROM gift 
WHERE category='0' 
AND id=($ID * $interval);