2 Abfragen über gleiche Inhalte, jedoch nur einmal anzeigen

QUEST08

Erfahrenes Mitglied
Hallo,

hat jemand zufällig eine Idee, wie ich folgendes Problem lösen kann?

Ich habe eine Tabelle mit Partnern, auf einer Ausgabe-Seite sollten max 5 Partner angezeigt werden, (sortiert nach Hit-Ins). Ich habe eine zusätzliche Schleife eingebraut, damit wenn keine 5 Partner angezeigt werden, das Script sich automatisch die restlichen dazu holt (zufällig per RAND()).

Jetzt möchte ich jedoch vermeiden, dass per Partner X (der bei der ersten Ausgabe bereits gelistet wird) nochmals auftaucht.

Gibt es eine einfache Möglichkeit das so zu gestalten? Habe bereits an UNIQE oder DISTINCT gedacht, jedoch müsste ich dazu ja erstmal die vorherige Abfrage "zwischenspeichern". Jemand eine Idee?
 
Du könntest doch in der zweiten Abfrage die bereits vorhandenen ausschließen.

SQL:
SELECT * FROM tabelle WHERE id <> '1' AND id <> '2' AND id <> '3'
 
Zuletzt bearbeitet von einem Moderator:
@tombe
Mit OR bringts nicht wirklich viel. Dein SQL erlaubt auch id=1, id=2, id=3 etc. (1 ist ungleich 2 und somit ist dein Zweites Argument true). AND würde da mehr nützen

@QUEST08
Irgendiwe versteh ich nur Bahnhof.
Du nimmst die 5 Partnern mit den meisten hits. Wenn da weniger als fünf sind, holst du die restlichen. Welche Restlichen?
Hast du mal ein Code-Beispiel von deinem jetztigen Stand? Oder ein Datenbeispiel?
 
Gerne:

also eine Tabelle "system_partner" und eine "system_partner_tracking" in beiden ist die Spalte "partner_url" vorhanden. In der ersten Abfrage lese ich alle Partner aus, welche in den letzten 24 Stunden am meisten Hit-Ins brachten und in der zweiten lese ich alle Partner aus der "system_partner" aus. Hier der Code:

PHP:
<?php

error_reporting(E_ALL ^ E_NOTICE);

include "system_files/connection.php";

$timestamp_now  = time(); //Jetzt
$timestamp_last = $timestamp_now - 86400; //Vor 24 Stunden

$max_partner = 5;

$result = @mysql_query("SELECT *, COUNT(partner_url) AS partner FROM `system_partner_tracking` WHERE timestamp >= '$timestamp_last' GROUP BY partner_url ORDER BY partner DESC LIMIT $max_partner") or die(mysql_error());

$zaehlen = 0;

while ($row = mysql_fetch_array ($result)) 

{

echo "<a target=\"_blank\" style=\"text-decoration: none\" href=\"http://www.".$row['partner_url']."\"><span style=\"text-decoration: none\"><font face=\"Tahoma\" size=\"2\" color=\"#DAE913\">- ".$row['anzeigentext']."</font></span></a>";
echo "<br>";

$zaehlen++;

};

if ($zaehlen<$max_partner) {

$rest = $max_partner-$zaehlen;

$result = @mysql_query("SELECT partner_url,anzeigentext FROM `system_partner` ORDER BY RAND() LIMIT $rest") or die(mysql_error());

while ($row = mysql_fetch_array ($result)) 

{

echo "<a target=\"_blank\" style=\"text-decoration: none\" href=\"http://www.".$row['partner_url']."\"><span style=\"text-decoration: none\"><font face=\"Tahoma\" size=\"2\" color=\"#DAE913\">- ".$row['anzeigentext']."</font></span></a>";
echo "<br>";

};

};

mysql_close($mysql_ce);

?>

AND ist eine gute Idee, dann müsste ich nur die "Ergebnisse" in ein Array packen und in der nächsten Abfrage nochmals auslesen. It das performant genug?
 
Zuletzt bearbeitet:
Du gehst ja beim ersten Durchgang alle Partner die du ausgeben willst mit einer Schleife durch. Lies da gleich die partner_url in einen Array ein. Diesen wandelst du nachher in eine Komaseparierte Liste und prüfst mit NOT FIND_IN_SET().
PHP:
$urls = array();
while(...){
    echo .....;
    $urls[] = $row['partner_url'];
}
$urllist = implode(',', $urls);
...
$result = @mysql_query("
SELECT partner_url,anzeigentext 
FROM `system_partner` 
WHERE NOT FIND_IN_SET(partner_url, '{$urllist}') 
ORDER BY RAND() LIMIT $rest
    ") or die(mysql_error());
 
Zurück