2016-08-09 63 views
1

Ich wollte wissen, ob es möglich ist, die 10 meistgesehenen Artikel in dieser Woche (zwischen heute und 7 Tage zurück) mit PDO PHP zu erhalten.TOP 10 Artikel Besucher zählen über PDO PHP

Das Hauptproblem ist, dass auf zwei separaten Tabellen. Primärtabelle ist die Tabelle der Artikel. Und die zweite Tabelle ist eine Tabelle Besucher von IP.

Beiträge (ARTIKEL TABLE):

1.ID (Text)

2.TITLE (Text)

3.TEXT (Text)

Besucher (Zählertabelle):

1.ID (number)

2.IP (text)

3.DATE (Zeitstempel)

4.ID_POSTS (Text)

Der vollständige php code:

$week_start = date('Y-m-d',time()+(1 - date('w'))*24*3600); 
$week_end = date('Y-m-d',time()+(7 - date('w'))*24*3600); 
$query = "SELECT * FROM visitor WHERE DATE BETWEEN '".$week_start."' AND '".$week_end."' LIMIT 0, 10 "; 
$result = $db->prepare($query); 
$result->execute(); 
$i=1; 

while($row = $result->fetch(PDO::FETCH_ASSOC)) { 
$post[$i]=$row[ID]; 
$i++; 
} 

for ($i = 1; $i <= 10; $i++) { 
$query = "SELECT * FROM POSTS WHERE ID_POST = '".$post[$i]."' LIMIT 0, 10"; 
$result = $db->prepare($query); 
$result->execute(); 

while($row = $result->fetch(PDO::FETCH_ASSOC)) { 
echo<<<PRINT 
$row[ID].$row[TITLE]: $row[text] 
PRINT; 
} 
} 

Das Problem, das ich denke, ist, dass Sie zählen müssen, wie viele Leute am Tisch waren, schrieben die sekundäre und verschieben dann die primäre Tabelle.

Schritte: 1. Graf, wie viele jeden Artikel jede Woche durch die Sekundärtabelle eingetragen 2. Extrakt des 10 Meist gesehen gleiche Woche 3. Derzeit ist die 10 am meisten gelesene Artikel in der gleichen Woche von der Haupttabelle

Vielen Dank im Voraus.

+0

Falsche Reihenfolge in Abfrage. Limit muss nach WHERE-Klausel kommen !! – Saty

+0

Verwenden Sie Ihre Abfrage als 'SELECT * VON POSTS WHERE ID_POST =' ". $ Beitrag [$ i]." 'LIMIT 0, 10 "' – Saty

+0

@Saty SEIN NICHT DAS PROBLEM – TheQuestionerMan

Antwort

1

Für eine solche Abfrage würde ich eine COUNT(), GROUP BY, ORDER BY und LIMIT 10 erwarten. Daraus folgt:

SELECT id_post, COUNT(*) as cnt 
FROM visitor v 
WHERE DATE BETWEEN '".$week_start."' AND '".$week_end."' 
GROUP BY id_post 
ORDER BY cnt DESC 
LIMIT 0, 10 ; 

Hinweis: Die WHERE Klausel immer folgte die FROM Klausel.

Sie sollten auch keine Daten in die Abfragezeichenfolge einbetten. Sie sollten stattdessen lernen, Parameter zu verwenden.

+0

Es funktioniert nicht ... können Sie den vollen Beitrag code pls @gordon TIA – TheQuestionerMan

+0

Vielleicht ist 'COUNT (DISTINCT ip)' näher an dem, was das OP wollte – apokryfos

+0

@TheQuestionerMan .... Sie sollten erklären, was "nicht funktioniert" bedeutet. –

0
select * from (select id, count(1) as cnt 
from visitor where date > (NOW()- INTERVAL 7 DAY) group by id) v1, posts p 
where v1.id = p.id 
order by v1.cnt desc 
limit 10 

Nicht getestet.