1

最後のクエリが常に 1 行を返す理由を誰かに説明してもらえますか? データベースには多くのレコードがあるため、1 つ以上を返す必要があります。

私の悪い英語でごめんなさい

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

2 に答える 2

4

クエリは次のようになります。

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

の内部がINすべて 1 つの文字列であることに注意してください。この 1 つの文字列は int に変換されます。これは、数字以外の最初の文字で停止することによって発生します。したがって、クエリは次のようになります。

SELECT * FROM books WHERE book_id IN (2)

内の一重引用符を削除してみてくださいIN

注: 値が int でない場合は、implodeを :implode("','",$records)に変更してみてください。引用符はIN.

于 2012-04-13T16:43:50.047 に答える
1

一見すると、for ループをお勧めします。

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

while ループである必要があります。

while($fetch=mysql_fetch_assoc($query))

その for ループ コードで 1 つのレコードしか実行していないと思います。

ただし、左結合選択を行うことをお勧めします

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

これは、私が期待するデータベースのパフォーマンスに関して、はるかに最適です。

于 2012-04-13T16:49:26.103 に答える