我需要能够在每次页面加载时显示数据库中的下一个引号。我怎样才能做到这一点?
我能想到的唯一解决方案是:
1. SELECT counter FROM certain_table
2. SELECT COUNT(*) as num_of_quotes FROM quotes
3. counter = (counter + 1) % num_of_quotes;
4. SELECT * FROM quotes LIMIT counter, 1
5. Show quote
6. UPDATE certain_table SET counter = {counter}
但这意味着每次将执行4个SQL查询来显示一个报价。有什么方法可以更有效地吗??
附言:它将用PHP编码,页面将通过JS文件在外部页面上使用。
在引号表中添加一列,并将其称为view_counter
。这将包含每个报价显示给用户的次数。
本例假定表结构如下:
quotes(id, quote, view_counter)
以下是查询:
select id, quote
from quotes
order by view_counter asc
limit 1
很简单,对吧?现在,在呈现页面之前,运行以下查询:
update quotes set view_counter = 1+ view_counter where id = :quote_id
其中:quote_id
是您下载的查询id的值。
两个查询!还不错。但是,如果我们有一个种族条件,并且碰巧两个不同的用户同时请求查询,该怎么办?你有两个选择:
- 不要在意(我支持这一点),因为如果世界的另一端有人读过和他一样的话,没有人会流汗
- 锁定表格。如果你想使用这个路由,在我说的2之前运行这个查询:
LOCK TABLES quote WRITE
,这个作为最后一个查询UNLOCK TABLES
我投票支持备选方案1。
如果您使用唯一ID存储报价,您可以执行类似的操作
下一个报价:
SELECT * FROM `quotes` WHERE `id` > $currentID ORDER BY `id` ASC LIMIT 1 ;
对于以前的报价
SELECT * FROM `quotes` WHERE `id` < $currentID ORDER BY `id` DESC LIMIT 1 ;
基本上,您将在数据库中查找下一个和上一个ID。并将其与你现在正在播放的节目进行比较。这将显示您想要的报价