首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示数据库中的特色项目

显示数据库中的特色项目
EN

Stack Overflow用户
提问于 2013-05-04 14:24:44
回答 8查看 897关注 0票数 13

我有如下数据库表。

代码语言:javascript
复制
id, bungalow_name, type, address, featured 

平房可以放在首页上。如果是平房,则featured列的值为1。我在桌子上有50个平房,在给定的时间里有5-7个平房。

让我们假设特色平房名称如下所示。

代码语言:javascript
复制
bungalow 1, bungalow 2, bungalow 3, .........., bungalow 6

我想要做的就是每天在主页上展示一个特色平房。我想循环如下每个月如下所示。考虑到我不想为每个页面加载随机显示一个平房。我想每天展示一个平房的基础。

代码语言:javascript
复制
today              -> bungalow 1
tomorrow           -> bungalow 2
day after tomorrow -> bungalow 3
...
After bungalow 6, bungalow 1 is shown on the next day.

我该怎么做呢?用SQL/PHP能做到吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-05-06 19:45:08

您可以使用以下MySQL查询:

代码语言:javascript
复制
SELECT *
FROM Bungalows
WHERE id = (
  SELECT b1.id
  FROM
    Bungalows b1 LEFT JOIN Bungalows b2
    ON b1.id>b2.id AND b2.featured=1
  WHERE
    b1.featured=1
  GROUP BY
    b1.id
  HAVING
    COUNT(b2.id) = (SELECT
                      DATEDIFF(CURDATE(), '2013-05-06') MOD
                      (SELECT COUNT(*) FROM Bungalows WHERE Featured=1))
  )

请参阅fiddle here。'2013-05-06‘是你想要开始展示第一个特色平房的日子。他们将显示按ID排序,从'2013-05-06‘开始。

编辑

以下查询将返回自2013-05-06以来经过的天数:

代码语言:javascript
复制
SELECT DATEDIFF(CURDATE(), '2013-05-06')

MOD函数将返回已用天数除以特征行数的整数余数:

代码语言:javascript
复制
SELECT DATEDIFF(CURDATE(), '2013-05-06') MOD
                          (SELECT COUNT(*) FROM Bungalows WHERE Featured=1)

如果有6个特色平房,它将在第一天返回0,第二天返回1,2,3,4,5,然后返回0,1,2...again。

MySQL没有返回排名(行数)的函数,因此您必须以某种方式模拟它。我是这样模拟的:

代码语言:javascript
复制
SELECT b1.id, COUNT(b2.id)
FROM
  Bungalows b1 LEFT JOIN Bungalows b2
  ON b1.id>b2.id AND b2.featured=1
WHERE
  b1.featured=1
GROUP BY
  b1.id

我自己也加入了平房桌。平房ID的等级是ID小于该值的平房的数量(因此称为join b1.id>b2.id)。

然后,我只选择具有上述函数返回的排名的行:

HAVING COUNT(b2.id) = (SELECT DATEDIFF(CURDATE(),'2013-05-06') MOD (SELECT COUNT(*) FROM Bungalows WHERE Featured=1))

如果使用MySQL,我的初始查询可以简化为:

代码语言:javascript
复制
SELECT b1.*
FROM
  Bungalows b1 LEFT JOIN Bungalows b2
  ON b1.id>b2.id AND b2.featured=1
WHERE
  b1.featured=1
GROUP BY
  b1.id
HAVING
  COUNT(b2.id) = (SELECT
                    DATEDIFF(CURDATE(), '2013-05-06') MOD
                    (SELECT COUNT(*) FROM Bungalows WHERE Featured=1))
票数 8
EN

Stack Overflow用户

发布于 2013-05-06 22:32:35

代码语言:javascript
复制
$dbh = new PDO(....); // use your connection data
$statement = $dbh->query("SELECT count(*) as size FROM bungalows where features = 1");
$data = $statement->fetchALL(PDO::FETCH_CLASS,"stdClass");
$i = date('z') % $data[0]->size;

$statement = $dbh->query("SELECT * FROM bungalows where features = 1 order by id LIMIT $i,1");
$bungalow = reset($statement->fetchALL(PDO::FETCH_CLASS,"stdClass"));

编辑

  • 删除了mysql_ calls
  • 按照fthiella的建议添加了一个order子句(谢谢: )
票数 3
EN

Stack Overflow用户

发布于 2013-05-08 11:53:49

尝试这个查询,它将在每一个情况下工作,随着特色平房等数量的增加,每天都会给出一个不同的。

在这里,在查询中,我为每个特色平房分配了从0到n的数字,然后通过除以到目前为止的特色平房总数diff,我找到了要展示的平房。

查询1

代码语言:javascript
复制
select 
   a.* 
from 
   (select 
      @rn:=@rn+1 as rId, 
      b.cnt,  
      a.* 
   from 
      Bunglows a
   join 
      (select @rn:=-1) tmp
   join
      (select 
         count(*) as cnt 
      from 
         Bunglows 
      where 
         featured=1)b
   where 
      featured=1) a
where  
   datediff(CURDATE(), '2013-01-01')%a.cnt=a.rId

代码语言:javascript
复制
| RID | CNT | ID | BUNGALOW_NAME | FEATURED |
---------------------------------------------
|   3 |   4 |  6 |    bungalow 4 |        1 |

编辑

代码语言:javascript
复制
select count(*) as cnt from Bunglows where featured=1

此查询查找特色平房总数

代码语言:javascript
复制
select @rn:=@rn+1 as rId, b.cnt, a.* from Bunglows a join (select @rn:=-1) tmp join     select count(*) as cnt from Bunglows where featured=1

此查询向每个特色平房添加从0到n的行号

主查询首先查找与当前日期和旧日期不同的日期,并根据特征平房总数查找mod值,这将给出从0到n-1的值,我还添加了一个where子句,用于检查除法值是否等于我们指定的rowid。

希望这能帮到你。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16371256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档