2012-04-13 7 views
1

Kann mir jemand erklären, warum die letzte Abfrage immer 1 Zeile zurückgibt. es sollte mehr als 1 zurückgeben, weil es viele Datensätze in der Datenbank gibt!PHP 'IN' Abfrage gibt nur 1 Zeile zurück

Sorry für mein schlechtes Englisch

  $query=mysql_query("SELECT book_id FROM ".DB_PREF."books_cats_list WHERE cat_id='".$cat."'"); 
      if($row=mysql_num_rows($query)) 
      { 

       //fetching all books from $cat category 
       for($i=0; $fetch=mysql_fetch_assoc($query); $i++) 
       { 
        $records[$i]=$fetch['book_id']; 
       } 

       //Joining all records in a string for next query 
       $records=implode(",",$records); 

       //returning num rows if there're book_id records in $records array 
       $query=mysql_query("SELECT * FROM ".DB_PREF."books WHERE book_id IN ('".$records."')"); 
       $rows=mysql_num_rows($query); 
       echo $rows; 
+0

Sie sollten mysql_fetch_assoc() verwenden, um die zweiten Abfrageergebnisse genau wie beim ersten zu lesen. – MarcinJuraszek

Antwort

4

Ihre Anfrage wird wie folgt aussehen:

SELECT * FROM books WHERE book_id IN ('2,3,4,5') 

Beachten Sie, wie in der IN, es ist alles eine Saite. Diese eine Zeichenfolge wird in eine int konvertiert. Dies geschieht durch Anhalten am ersten Nicht-Nummernzeichen. Also, die Abfrage wird:

SELECT * FROM books WHERE book_id IN (2) 

Versuchen Sie, die einfachen Anführungszeichen innerhalb der IN zu entfernen.

HINWEIS: Wenn Ihre Werte nicht ints sind, versuchen Sie, die implode zu: implode("','",$records) zu ändern, und behalten Sie die Anführungszeichen in der IN.

+0

ausprobiert, immer noch nicht funktioniert :( –

+0

Ok es scheint zu arbeiten, mit Ihrer letzten Notiz angewendet :) –

+0

@AntonioCiccia: Froh könnte ich helfen :-) –

1

Auf den ersten Blick schlage ich vor der for-Schleife:

while($fetch=mysql_fetch_assoc($query)) 

ich es nur erwarten für Loop-Code mit, dass ein Datensatz tut:

for($i=0; $fetch=mysql_fetch_assoc($query); $i++) 

eine while-Schleife sein sollte.

Ich schlage vor, jedoch haben Sie eine LEFT JOIN wählen

SELECT * FROM books_cats_list as cat 
left join books as book on cat.book_id = book.book_id 
WHERE cat.cat_id='$cat' 

weit mehr optimal in Bezug auf die Performance der Datenbank Dies sein ich erwarte.

Verwandte Themen