Показанный товар из базы данных

У меня есть таблица базы данных, как показано ниже.

id, bungalow_name, type, address, featured 

Бунгало может быть представлено на главной странице. Если используется бунгало, столбец featured имеет значение 1. У меня есть 50 бунгало в столах и 5-7 бунгало представлены в определенный момент времени.

Предположим, что признанные имена бунгало приведены ниже.

bungalow 1, bungalow 2, bungalow 3, .........., bungalow 6

То, что я пытаюсь сделать, - показать на главной странице бондау на главной странице за каждый день. И я хочу, чтобы петли, как показано ниже, как показано ниже для каждого месяца. Учитывая, что я не хочу показывать бунгало случайным образом для каждой загрузки страницы. Я хочу показать в день одну базу бунгало.

today              -> bungalow 1
tomorrow           -> bungalow 2
day after tomorrow -> bungalow 3
...
After bungalow 6, bungalow 1 is shown on the next day.

Как я могу это сделать? Возможно ли это с помощью SQL/PHP?

Ответы

Ответ 1

Вы можете использовать этот запрос 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))
  )

Смотрите здесь скрипку здесь. '2013-05-06' - это тот день, когда вы хотите начать показывать первое особенное бунгало. Они будут показаны по идентификатору, начиная с '2013-05-06'.

ИЗМЕНИТЬ

Следующий запрос вернет количество прошедших дней с 2013-05-06:

SELECT DATEDIFF(CURDATE(), '2013-05-06')

функция MOD вернет целочисленный остаток от деления числа прошедшего дня на число признанных строк:

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

Если есть 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

Я присоединяюсь к таблице Бунгало с собой. Рангом идентификатора бунгало является количество бунгало, у которого идентификатор меньше этого (следовательно, соединение b1.id > b2.id).

Затем я выбираю только строку с RANK, возвращаемую функцией выше:

HAVING   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))

Ответ 2

$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_
  • добавил предложение о заказе, как предложил fthiella (спасибо:))

Ответ 3

Попробуйте этот запрос, он будет работать в каждом случае с увеличением количества предлагаемых бунгало и т.д. и каждый день будет давать другой.

Здесь, в запросе, я присваиваю номера каждому включенному бунгало от 0 до n и получаю затем, деля общее количество предлагаемых бунгало на сегодняшний день diff. Я нахожу отображаемое бунгало.

Запрос 1:

select 
   a.* 
from 
   (select 
      @rn:[email protected]+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

SQL FIDDLE:

| RID | CNT | ID | BUNGALOW_NAME | FEATURED |
---------------------------------------------
|   3 |   4 |  6 |    bungalow 4 |        1 |

ИЗМЕНИТЬ

select count(*) as cnt from Bunglows where featured=1

В этом запросе обнаружены общие признанные бунгало

select @rn:[email protected]+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

Основной запрос сначала определяет дату diff от текущей даты и старую дату и находит значение мод по общим признакам бунгало, которые будут давать значения от 0 до n-1, и я добавил предложение where, которое проверяет, чтобы разделенное значение было равный rowid, который мы назначили.

Надеюсь, что это поможет...

Ответ 4

Основная концепция моего ответа:

1/Создайте список всех предлагаемых бунгало. Это достигается в подзапросе, где каждому бунгало присваивается уникальный порядковый номер. Код для поля seq_num основан на ответе здесь

2/Выберите одно бунгало из списка, указанное на основании того, где мы находимся в этом месяце. Для этого я смотрю на день месяца на сегодняшний день, используя код day(curdate()), и я нахожу мод этого номера для общего количества предлагаемых бунгало.

select  sq.bungalow_name
from    (
        select  bungalow_name
                ,@curRow := @curRow + 1 AS seq_num
        from    table1, (SELECT @curRow := 0) r
        where   featured = 1
        order by
                bungalow_name desc
        ) sq
where   sq.seq_num = mod(day(curdate()),(select count(*) from table1 where featured = 1))

Пример этого SQL Fiddle

Ответ 5

Вы должны отслеживать последнюю дату отображения для каждой признанной записи (last_viewed). Для новых записей установите эту дату в один день в прошлом, например. 2000-01-01. Если есть запись с текущей датой, используйте ее. В противном случае используйте запись с самой ранней датой.

SELECT *, IF(DATE(last_viewed)=CURDATE(), 1, 0) AS current
   FROM #__bungalows
   WHERE featured=1
   ORDER BY current DESC, last_viewed ASC
   LIMIT 0,1

Как и счетчик hit в com_content, вы должны добавить метод удара в вашу модель бунгало, которая устанавливает столбец last_viewed выбранного бунгало now().

Ответ 6

select ....

where featured = 1
limit DAYOFYEAR(NOW()) % (select count(*) from ... where featured = 1), 1

Я не уверен, разрешен ли subselect в лимите. Возможно, вам придется выполнить этот запрос отдельно. Это будет вращаться каждый день. Легкий лихорадочный лимонный сок.

edit: выполнить в 2 запросах

$query = "SELECT COUNT(*) FROM ... WHERE FEATURED = 1";
$count = intval(array_pop(mysql_fetch_assoc(mysql_query($query))));

$query = "
select ....

  where featured = 1
  limit DAYOFYEAR(NOW()) % {$count}, 1
";

СДЕЛАНО!

Ответ 7

По модулю оператора% делает трюк:

Сначала добавьте столбец "counter int".

Затем укажите числовые столбцы, например, 1,2,3... Если вы ленивы, вы можете использовать это:

set @cc=0;
update bungalows set counter=(select @cc:[email protected]+1) where featured=1;

Теперь все готово, и вы просто можете сделать первый выбор:

select * from bungalows where featured=1 and counter%(select count(*) from bungalows where featured=1)=0;

И каждый раз, прежде чем вам понадобятся следующие специальные бунгало, выполните следующие действия:

update bungalows set counter=counter+1 where featured=1;

Затем снова:

select * from bungalows where featured=1 and counter%(select count(*) from bungalows where featured=1)=0;

...

update bungalows set counter=counter+1 where featured=1;

и т.д.

Ответ 8

Отметьте здесь SQLFiddle

SELECT *
FROM bungalows b
  JOIN (SELECT
          ( DAYOFMONTH(CURDATE() ) % COUNT(b2.id) ) AS slab,
          COUNT(b2.id) AS total_count
        FROM bungalows b2
        WHERE b2.featured = 1) AS b3
WHERE IF(b3.slab = 0, b3.total_count, b3.slab) = (SELECT
                                                    COUNT(id)
                                                  FROM bungalows b1
                                                  WHERE b.id >= b1.id
                                                      AND b1.featured = 1)
    AND b.featured = 1