-1

MySQL を使用して PDO 付きの​​ PHP を使用していますが、問題は SQL ステートメントを実行し、結果を HTML に書き出すことです。その後、別の SQL ステートメントが実行され、返されるべきではない行が返されるという問題が発生します。PHPMyAdmin でこの 2 番目のクエリを実行すると、期待どおりの結果が得られるため、これが正しいことはわかっています。環境は以下の通り(PHP 5.2.17、MySQL 5.30、Apache 2.2.25)。モンキーレンチを状況に投げ込むだけで、私のPCのように機能します。これが役立つ場合のSQLステートメントは次のとおりです。

$unusedContactsQuery = $dbc->prepare("select idContact, contactName 
from contactinfo
where iduser = :iduser
and contactAuthorized = 1
and idcontact not in (select a.idcontact from  contactinfo a                    
        inner join eventcontacts c on a.idContact = c.idContact
            inner join eventschedule b on c.idEventContact = b.idEventContact
                where b.idEventContact = :idEventContact
                and a.iduser = :iduser
                and contactAuthorized = 1)");

*連絡先リスト: Bella Lugosi woody woodpecker Bucky Winters Bella Lugosi woody woodpecker

Bella Lugosi と woody woodpecker は、そのリストの一番上にある最初の 2 つの名前の重複です。最初のクエリは最初の 2 つの名前を返します (そのクエリで rowCount() を実行すると 2 が表示され、2 番目のクエリで rowCount() を実行すると 3 が表示されたため、最後の 3 つの名前は 2 番目から引き戻されました)。クエリ)では、なぜこれが起こっているのか、誰にも分かりますか?(同じクエリが PHPMyAdmin で正しく機能する場合、取得されるべきではない行を引き戻す 2 番目のクエリ)

4

1 に答える 1

0

推測では、2 つのクエリでパラメーターが同じではないと思います。同じクエリが異なる数の行を返す理由はありません。

を実行するのではなく、左結合でNOT IN直接contactinfo結合して null 行を探すことをお勧めします。これもおそらく高速です。

テストするデータなしでクエリを書き直すのは難しいですが、試してみてください

SELECT idContact, contactName 
FROM contactinfo ci
LEFT JOIN eventcontacts ec USING(idContact)
LEFT JOIN eventschedule es USING(idEventContact)

WHERE ci.iduser = :iduser 
AND ec.idEventContact = :idEventContact 
AND ci.contactAuthorized = 1 
AND es.idEventContact IS NULL
于 2013-09-01T02:43:24.530 に答える