0

我需要能够在每个页面加载时显示数据库中的下一个报价。我怎样才能做到这一点?

我能想到的唯一解决方案是:

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 查询以显示报价。有什么方法可以更有效地做到这一点?

PS 它将使用 PHP 进行编码,并且页面将可通过 JS 文件在外部页面上使用。

4

2 回答 2

1

在您的报价表中添加一列,然后调用它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 的值在哪里。

两个查询!不错。但是如果我们有一个竞争条件,并且碰巧两个不同的用户同时请求一个查询呢?你有两个选择:

  1. 不在乎(我赞同),因为如果其他人在世界的另一端读过与他相同的报价,没有人会流汗。
  2. 锁定表。如果你想使用这条路线,在我说的 2 之前运行这个查询:LOCK TABLES quote WRITE和这个作为最后一个查询UNLOCK TABLES

我投票给选项 1。

于 2013-07-25T07:28:17.943 回答
0

如果您使用唯一 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。并将其与您现在使用的进行比较。这将显示您想要的报价

于 2013-07-25T06:00:11.773 回答