Frage Featuring Item aus der Datenbank anzeigen


Ich habe die Datenbanktabelle wie folgt.

id, bungalow_name, type, address, featured 

Ein Bungalow kann auf der Homepage angezeigt werden. Wenn ein Bungalow vorkommt, featured Spalte hat den Wert 1. Ich habe 50 Bungalows in den Tischen und 5-7 Bungalows sind zu einer bestimmten Zeit.

Nehmen wir an, vorgestellte Bungalow-Namen sind wie folgt.

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

Was ich versuche zu tun, ist einen gekennzeichneten Bungalow auf der Homepage für jeden Tag zu zeigen. Und ich möchte für jeden Monat wie folgt wie folgt schleifen. Da ich keinen Bungalow für jede Seitenladung nach dem Zufallsprinzip zeigen möchte. Ich möchte pro Tag eine Bungalowbasis zeigen.

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

Wie kann ich es tun? Ist es überhaupt möglich mit SQL / PHP?


13
2018-05-04 06:24


Ursprung


Antworten:


Sie könnten diese MySQL-Abfrage verwenden:

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

Bitte sehen Sie Geige Hier. "2013-05-06" ist der Tag, an dem Sie den ersten Bungalow zeigen möchten. Sie werden nach ID angezeigt, beginnend mit "2013-05-06".

BEARBEITEN

Die folgende Abfrage gibt die Anzahl der verstrichenen Tage seit 2013-05-06 zurück:

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

Die MOD-Funktion gibt den ganzzahligen Rest der Division der Anzahl der verstrichenen Tage durch die Anzahl der vorgestellten Zeilen zurück:

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

Wenn es 6 vorgestellten Bungalows gibt, wird es 0 am ersten Tag, 1 der zweite, 2,3,4,5 und dann 0,1,2 ... wieder zurückgeben.

MySQL hat keine Funktion, um einen RANK (Anzahl der Zeilen) zurückzugeben, also müssen Sie es irgendwie simulieren. Ich habe es so simuliert:

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

Ich schließe mich dem Bungalow-Tisch an. Der Rang der Bungalow-ID ist die Anzahl der Bungalows, die eine ID kleiner als diese haben (daher die Verbindung b1.id> b2.id).

Ich wähle dann nur die Zeile aus, für die der RANK von der obigen Funktion zurückgegeben wurde:

HABEN     COUNT (b2.id) = (AUSWAHL                       DATEDIFF (CURDATE (), '2013-05-06') MOD                       (Wählen Sie COUNT (*) FROM Bungalows WHERE Featured = 1))

Wenn Sie MySQL verwenden, könnte meine ursprüngliche Abfrage wie folgt vereinfacht werden:

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
2018-05-06 11:45



$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"));

BEARBEITEN

  • Mysql_-Aufrufe wurden entfernt
  • eine Bestellklausel als fthiella vorgeschlagen (Danke :))

3
2018-05-06 14:32



Versuchen Sie diese Abfrage, es wird in jedem Fall mit der Zunahme der Anzahl der vorgestellten Bungalows usw. Funktionieren und täglich wird ein anderes geben.

Hier in der Abfrage gebe ich Zahlen zu jedem vorgestellten Bungalow von 0 bis n und empfange dann, indem ich die Gesamtzahl der vorgestellten Bungalows bis zum Datum dividiere, finde ich den Bungalow, um angezeigt zu werden.

Anfrage 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-FIDDLE:

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

BEARBEITEN

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

Diese Abfrage findet die gesamten vorgestellten Bungalows

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

Diese Abfrage fügt jedem Bungalow eine eigene Nummer von 0 bis n hinzu

Die Hauptabfrage findet zuerst das Datum diff von dem aktuellen Datum und ein altes Datum und finde den Mod-Wert durch die gesamten vorgestellten Bungalows, die Werte von 0 bis n-1 geben, und ich habe eine where-Klausel hinzugefügt, die nach dem geteilten Wert prüft Rowid, die wir zugeordnet haben ..

Hoffe das hilft...


3
2018-05-08 03:53



Das Grundkonzept meiner Antwort lautet:

1 / Erstellen Sie eine Liste aller vorgestellten Bungalows. Dies wird in der Unterabfrage erreicht, wo jeder Bungalow eine eindeutige Sequenznummer erhält. Der Code für das Feld seq_num basiert auf der Antwort Hier

2 / Wählen Sie einen Bungalow aus, der auf der Basis des Monats aufgeführt ist. Um dies zu tun, schaue ich den Tag des Monats für heute, mit dem Code day(curdate()) und ich finde den Mod dieser Anzahl an der Gesamtzahl der vorgestellten Bungalows.

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

Beispiel dazu SQL-Geige


2
2018-05-09 20:46



Sie müssen das letzte Datum der Anzeige für jeden vorgestellten Datensatz verfolgen (last_viewed). Legen Sie für neue Datensätze dieses Datum auf einen Tag in der Vergangenheit fest, z. 2000-01-01. Wenn es einen Datensatz mit dem aktuellen Datum gibt, verwenden Sie diesen. Verwenden Sie nicht den Datensatz mit dem frühesten Datum.

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

Wie hit Zähler in com_contentsollten Sie Ihrem Bungalow - Modell eine Hit - Methode hinzufügen, die den last_viewed Spalte des ausgewählten Bungalows nach now().


0
2018-05-06 12:17



select ....

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

Ich bin mir nicht sicher, ob Subselect im Limit erlaubt ist. Möglicherweise müssen Sie diese Abfrage separat durchführen. Dies wird jeden Tag rotieren. Das is doch Babyleicht.

edit: um in 2 Abfragen durchzuführen

$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
";

ERLEDIGT!


0
2018-05-06 19:26



Der Modulo-Operator% macht's:

Fügen Sie zuerst eine Spalte "counter int" hinzu.

Als nächstes nummerieren Sie die vorgestellten Spalten wie 1,2,3 ... Wenn Sie faul sind, können Sie dies verwenden:

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

Jetzt ist alles vorbereitet und Sie können einfach eine erste Auswahl treffen:

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

Und bevor Sie die nächsten Bungalows brauchen, machen Sie:

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

Dann wieder:

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;

und so weiter...


0
2018-05-11 23:50



Überprüfen Sie hier mit 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

0
2018-05-14 08:46