显示数据库中的特色项目

Tec*_*hie 13 php mysql sql joomla logic

我有数据库表如下.

id, bungalow_name, type, address, featured 
Run Code Online (Sandbox Code Playgroud)

主页上设有简易别墅.如果有简易别墅,则featured列具有价值1.我在桌子上有50个平房,在给定时间有5-7个平房.

我们假设特色平房名称如下.

bungalow 1, bungalow 2, bungalow 3, .........., bungalow 6
Run Code Online (Sandbox Code Playgroud)

我想要做的是在每天的主页上展示一个特色的平房.我希望每个月循环如下所示.鉴于我不想为每个页面加载随机显示一个平房.我想每天展示一个平房.

today              -> bungalow 1
tomorrow           -> bungalow 2
day after tomorrow -> bungalow 3
...
After bungalow 6, bungalow 1 is shown on the next day.
Run Code Online (Sandbox Code Playgroud)

我该怎么做?甚至可以使用SQL/PHP吗?

fth*_*lla 8

您可以使用此MySQL查询:

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))
  )
Run Code Online (Sandbox Code Playgroud)

请看这里的小提琴.'2013-05-06'是您想要开始展示第一个特色平房的日子.它们将按照"2013-05-06"的顺序按ID排序.

编辑

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

SELECT DATEDIFF(CURDATE(), '2013-05-06')
Run Code Online (Sandbox Code Playgroud)

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

SELECT DATEDIFF(CURDATE(), '2013-05-06') MOD
                          (SELECT COUNT(*) FROM Bungalows WHERE Featured=1)
Run Code Online (Sandbox Code Playgroud)

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

MySQL没有返回RANK(行数)的函数,所以你必须以某种方式模拟它.我用这种方式模拟它:

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
Run Code Online (Sandbox Code Playgroud)

我正在加入Bungalows桌子.平房ID的等级是ID小于的平房的数量(因此连接b1.id> b2.id).

然后我只选择上面函数返回的RANK行:

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

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

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))
Run Code Online (Sandbox Code Playgroud)