2016-07-27 70 views
4

我试图从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."'; 

(但你不应该引用整数值)。

或者....

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

或者,与最近的MySQL,使用MyISAM引擎,可以define a primary key based on a natural key and autoincrement value。在你的情况下,“自然”键将是类别。然后,如果你确保你是在单调区间分配数据库中的存储的ID ,只是.....

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