2

PHP で mysql クエリをチェックしている場合、mysql クエリに従って正確な結果が得られませんでした。

しかし、同じクエリを実行すると、期待どおりの結果が得られます。これが mysql クエリです。

SELECT id, follow_up_datetime, followed_by, follow_up_status, case_time_zone, description, case_id
FROM case_note
WHERE TYPE LIKE '%follow-up-open%'
AND (
    follow_up_datetime LIKE '%2013-01-08%'
    OR date( follow_up_datetime ) < '2013-01-08'
)
AND follow_up_status <= '1'
GROUP BY case_id
ORDER BY case_id DESC
LIMIT 0 , 30

このクエリの結果は次のとおりです。

mysql_結果

しかし、php で同じクエリを使用すると、間違った ID を取得します: PHP

//current date is "2013-01-08";
$follow_q = "SELECT id, follow_up_datetime, followed_by, follow_up_status, case_time_zone, description, case_id
                 FROM case_note
                 WHERE `type` LIKE '%follow-up-open%'
                 AND (
                 follow_up_datetime LIKE '%$current_date%'
                 OR date(follow_up_datetime) < '$current_date'
                 )
                 AND follow_up_status <= '1' 
                 GROUP BY case_id 
                 ORDER BY case_id DESC";
$follow_r = mysql_query($follow_q) or die('Error in Query!<br />' . mysql_error());

このクエリは、id の like を提供します53, 84, 47, 36

最後の 3 つの ID は正しいですが、最初の ID は正しくありません。私は最初のIDが欲しいです139。誰でも正確な問題を見つけるのを手伝ってもらえますか?

UPDATE : ここで、id の結果を更新しました53

ここに画像の説明を入力

4

3 に答える 3

1

クエリ自体に関するいくつかのヒント:

タイムスタンプまたは日時follow_up_datetimeのタイプである必要があります

LIKE日付条件に演算子は必要ありません。

DATE( `follow_up_datetime` ) = '2013-01-08' 
OR 
DATE( `follow_up_datetime` ) < '2013-01-08' 

これは次のように短縮できます。

DATE( `follow_up_datetime` ) <= '2013-01-08' 

常に現在の日付と比較する場合は、次を使用できますCURRENT_DATE

DATE( `follow_up_datetime` ) <= CURRENT_DATE

int 型の列を文字列と比較しないでください。これにより、MySQL は列のすべての値をfollow_up_status文字列にキャストすることになります。

`follow_up_status` <= 1

LIKEタイプ条件が必要ですか?

`type` = 'follow_up_open'

はるかに高速になります。

MySQL 拡張機能に関する PHP ドキュメント:

この拡張モジュールは PHP 5.5.0 で非推奨になり、将来的に削除される予定です。代わりに、MySQLiまたはPDO_MySQL拡張機能を使用する必要があります。詳細については、MySQL: API ガイドの選択および関連する FAQも参照してください。


編集:

ちょうどあなたに気づきましたGROUP BY case_id53idと idの両方139が同じ場合、 case_idMySQL はどの行を破棄できるかを知る必要があります。この情報を指定しないと、2 つの行のうちの 1 つが多かれ少なかれランダムに破棄されます。

この問題を回避するには、集計関数を使用します。あなたの場合MIN()、望ましい結果が得られます。

PHPヒアドキュメント表記法を使用して、クエリ全体をクリーンアップしました。

$follow_q = <<< EOQ
    SELECT 
        MIN( `id` ) AS `id`,
        `follow_up_datetime`,
        `followed_by`,
        `follow_up_status`,
        `case_time_zone`,
        `description`,
        `case_id`
    FROM
        `case_note`
    WHERE
        `type` = 'follow-up-open'
         AND
        `follow_up_datetime` <= '{$current_date}'
        AND
        `follow_up_status <= 1
    GROUP BY 
        `case_id`
    ORDER BY 
        `case_id` DESC
EOQ;
于 2013-01-07T11:14:09.860 に答える
0

問題はからである可能性がありますfollow_up_status <= '1'。列が数値タイプの場合は、値を文字列ではなく数値として渡す必要があります。試す:

follow_up_status <= 1
于 2013-01-07T10:59:50.997 に答える
0

私だったら、 $follow_q 変数をerror_log()し、そのクエリをコピーして MySQL に貼り付け、$current_date 変数が間違っている可能性があるため、同じ結果または間違った結果が返されるかどうかを確認します。

于 2013-01-07T11:18:05.900 に答える