保持我的订单

时间:2017-08-27 12:42:05

标签: php mysql mariadb

在CRM中,客户搜索数据并对其进行排序并打开一个数据,如位置编号为9且ID为12的数据,现在是客户,并将保存并获取下一个条目,我将如何获得现在的第一个条目我的例子是id 6?

在过去我拿了所有并做了一个循环搜索我的条目并得到了下一个但我认为这应该是一个更好的选择,我的方式是一种糟糕的表现。

感谢

  SELECT * FROM testdata WHERE age > 18 ORDER BY age DESC
Example of DB
    |id|Name      |age|
    |9 |perso1    |66 |
    |10|rergfdgd  |55 |
    |11|gthfghfh  |44 |
    |9 |hghghgh   |33 |
    |1 |kgthht    |22 |
    |2 |ghjgj     |21 |
    |3 |fhgjg     |20 | 
    |4 |hjhjhjh   |19 |
    |12|ghgjgjg   |18 |
    |6 |tgjhgf    |17 |
    |7 |jhmgmhg   |16 |
    |8 |fghgjgjg  |15 |

3 个答案:

答案 0 :(得分:1)

如果您希望按顺序获取查询,则光标将是正确的解决方案:https://dev.mysql.com/doc/refman/5.7/en/cursors.html

答案 1 :(得分:1)

如果你知道你找到的最后一行的位置是9,那么select中orderlimit的组合可以获取正确的数据......

SELECT * 
    FROM testdata 
    WHERE age > 18 
    ORDER BY age DESC
    LIMIT 9,1

请注意,这实际上是说 - 忽略前9行并只获取1行。

有关详细信息,请参阅https://mariadb.com/kb/en/the-mariadb-library/select/#limit

答案 2 :(得分:1)

我同意,每次拉动一个完整的结果集并循环遍历它们都可以正常工作,但是有更优雅的方法可以解决这个问题。

以下是我的推荐。

选项1: 使用布尔字段标记记录是否已被编辑。在此示例中,字段edited的默认值为0(false)。编辑记录后,将edited标志更改为1(true)。

您的选择查询将如下所示:

SELECT * FROM testdata WHERE age > 18 and edited = 0 ORDER BY age DESC limit 1

然后,在你的php代码中,没有必要循环遍历结果,你的查询中的第一条记录(只有在你包含LIMIT 1时才记录)将是下一条没有'尚未编辑。

选项2:添加一个date_modified字段,默认值为NULL。编辑记录后,将now()保存在date_modified字段中。您的查询将是:

SELECT * FROM testdata WHERE age > 18 and date_modified IS NOT NULL ORDER BY age DESC limit 1

与第一个选项一样,无需遍历结果,查询中的第一条记录(只有记录,如果包含LIMIT 1)将成为下一条记录的下一条记录。尚未编辑。