13

以下のようなデータベーステーブルがあります。

id, bungalow_name, type, address, featured 

バンガローはホームページに掲載できます。バンガローが紹介されている場合、featured列の値は です1。テーブルには 50 のバンガローがあり、一度に 5 ~ 7 のバンガローが紹介されています。

注目のバンガローの名前は以下の通りだとしましょう。

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

私がやろうとしているのは、毎日のホームページに注目のバンガローを表示することです。そして、月ごとに以下のようにループしたいと思います。ページの読み込みごとにバンガローをランダムに表示したくない場合。1日1バンガロー単位でご案内したいと思います。

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

どうすればいいですか?SQL/PHPでも可能ですか?

4

8 に答える 8

3

このクエリを試してみると、注目のバンガローなどの数が増加するたびに機能し、毎日異なるバンガローが表示されます。

ここで、クエリでは、各注目のバンガローに 0 から n までの番号を割り当て、次に、注目のバンガローの総数を日付の差分で割ることで、表示されるバンガローを見つけます。

クエリ 1 :

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

SQLフィドル

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

編集

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

このクエリは、注目のバンガローの総数を検索します

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 までの行番号を追加します。

メインクエリは、最初に現在の日付と古い日付からの日付の差分を見つけ、0 から n-1 までの値を与える注目のバンガローの合計で mod 値を見つけます。分割された値が割り当てたrowid..

お役に立てれば...

于 2013-05-08T03:53:49.400 に答える
3
$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が提案したように注文句を追加しました(ありがとう:))
于 2013-05-06T14:32:35.407 に答える
2

私の答えの基本的な概念は次のとおりです。

1/ すべての注目のバンガローのリストを作成します。これは、各バンガローに一意のシーケンス番号が与えられるサブクエリで実現されます。seq_num フィールドのコードは、こちらの回答に基づいています

2/ その月の場所に基づいて、リストからバンガローを 1 つ選びます。これを行うには、コードを使用して今日の日付をday(curdate())調べ、注目のバンガローの総数に対するその数の mod を見つけます。

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フィドルの例

于 2013-05-09T20:46:56.337 に答える
0
select ....

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

サブセレクトが制限で許可されているかどうかはわかりません。そのクエリを個別に実行する必要がある場合があります。これが毎日回転します。簡単ピーシーレモンスクイーズ.

編集: 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
";

終わり!

于 2013-05-06T19:26:02.083 に答える
0

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
于 2013-05-14T08:46:55.957 に答える
0

各注目レコードの最終表示日を追跡する必要があります ( 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_viewednow()

于 2013-05-06T12:17:42.210 に答える