2017-01-25 5 views
0

Ich versuche, Duplikate aus dem Ergebnis einer foreach-Schleife zu entfernen:Entfernen Sie doppelte Zeichenfolge von foreach-Schleife

foreach ($tags as $tag) { 
    $sql = "SELECT url,title,image,gift FROM listings LEFT JOIN tags ON listings.id=tags.product_id INNER JOIN tag_names ON tags.tag_id=tag_names.tag_id WHERE tag_names.tag_name=? and id!=$id ORDER BY RAND() LIMIT 5"; 
    $stmt = mysqli_prepare($mysqli, $sql); 
    $stmt->bind_param('s',$tag[0]); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    $row = $result->fetch_all(); 

    if (count($row) > 0) { 
     echo etc. 
    } 

Das Problem, das ich nicht wissen, ist, wie unter den verschiedenen Tags Echo doppelte Produkte zu überspringen. I.e.

Das gleiche Produkt kann unter dem Tag A und unter dem Tag B sein, aber ich möchte nur einmal angezeigt werden.

Jede Hilfe wäre willkommen.

Antwort

-1
foreach ($tags as $tag) { 
    $sql = "SELECT distinct url,title,image,gift FROM listings LEFT JOIN tags ON listings.id=tags.product_id INNER JOIN tag_names ON tags.tag_id=tag_names.tag_id WHERE tag_names.tag_name=? and id!=$id ORDER BY RAND() LIMIT 5"; 
    $stmt = mysqli_prepare($mysqli, $sql); 
    $stmt->bind_param('s',$tag[0]); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    $row = $result->fetch_all(); 

    if (count($row) > 0) { 
     echo etc. 
    } 
} 

Versuchen Sie es.

+0

bereits ohne Erfolg versucht, da die gleichen Produkte unter verschiedenen Tags in verschiedenen Arrays zurückgegeben werden. – Gremlin

0

Zuerst einen ganzen Datensatz mit der Klausel 'IN' abrufen und dann iterieren. Sie werden nur eine Abfrage haben.

Das Problem dabei ist, dass jede Abfrage ziemlich viel Overhead hat. Es ist viel schneller, 1 Abfrage auszugeben, die 100 Ergebnisse zurückgibt, als 100 Abfragen auszugeben, die jeweils 1 Ergebnis zurückgeben. Dies ist insbesondere dann der Fall, wenn sich Ihre Datenbank auf einem anderen Computer befindet, z. B. 1-2 m entfernt im Netzwerk. In diesem Fall verursacht die serielle Ausgabe von 100 Abfragen einen Mindestaufwand von 100-200 ms, auch wenn sie von MySQL sofort erfüllt werden können.

https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/

+0

Danke für den Tipp. Wie kann ich ein Array binden? – Gremlin

+0

http://stackoverflow.com/questions/920353/cani-i-bind-an-array-to-an-in-condition –

Verwandte Themen