0

複数のテーブルからデータを取得する次の MySQL があります。

SELECT * FROM $wpdb->posts
    LEFT JOIN taxi ON ($wpdb->posts.ID = taxi.taxiID)
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_date < NOW()+INTERVAL 1 DAY 
    AND $wpdb->term_taxonomy.taxonomy = 'category' 
    AND $wpdb->term_taxonomy.term_id IN(3)
    AND taxi.taxiID IS NULL
    AND ($wpdb->postmeta.meta_key = 'EndDate' AND $wpdb->postmeta.meta_value > DATE_ADD(NOW(), INTERVAL 3 HOUR))

昨日の時点で、クエリは結果を返していませんが、キッカーは次のとおりです。以前は、2 週間常に結果が返されていました。

多くの試行錯誤の後、問題を次の 1 行に絞り込みました。

AND taxi.taxiID IS NULL

この行により、タクシー テーブルにレコードがない投稿のみが表示されるように結果がフィルター処理されます。

誰でも問題を解決する方法を理解するのを手伝ってもらえますか?

4

2 に答える 2

0

PHPスクリプトのタイムアウトが発生している可能性がありますか? SQLクエリが変更されないだけで、データも変更されないという意味ではないことに注意してください。クエリが複雑すぎるか、データが多すぎる場合、タイムアウトが発生する可能性があります。これは、phpmyadmin で機能する理由を説明しますが、PHP スクリプトでは機能しません。phpmyadmin は、mysql サーバーが結果の一部のみを返すことを許可する LIMIT 句を追加するため、ほとんどタイムアウトになりません。

max_execution_time をより高い値に設定してみてください。

ini_set('max_execution_time', 300); //300 seconds = 5 minutes
于 2012-04-16T06:47:50.943 に答える
0

このクエリがヒアドキュメントにある場合は、補間を明示的にしてください。http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

$query = <<<HERE
SELECT * FROM {$wpdb->posts}
    LEFT JOIN userContests ON ({$wpdb->posts}.ID = taxi.taxiID)
    LEFT JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)
    LEFT JOIN {$wpdb->term_taxonomy} ON ({$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id)
    WHERE {$wpdb->posts}.post_status = 'publish' 
    AND {$wpdb->posts}.post_type = 'post' 
    AND {$wpdb->posts}.post_date < NOW()+INTERVAL 1 DAY 
    AND {$wpdb->term_taxonomy}.taxonomy = 'category' 
    AND {$wpdb->term_taxonomy}.term_id IN(3)
    AND ({$wpdb->postmeta}.meta_key = 'EndDate' AND {$wpdb->postmeta}.meta_value > DATE_ADD(NOW(), INTERVAL 3 HOUR))
HERE
于 2012-04-16T02:57:45.500 に答える