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_result

但是当我对 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 之类的53, 84, 47, 36

最后三个 id 是正确的,但第一个是不正确的。我想要第一个 id 是139。任何人都可以帮助找出确切的问题吗?

更新:在这里我更新了 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 类型的 col 与字符串进行比较,这将强制 MySQL 将 col 的所有值follow_up_status转换为字符串。

`follow_up_status` <= 1

你确定你需要LIKE类型条件吗?

`type` = 'follow_up_open'

会快很多。

关于 MySQL 扩展的 PHP 文档:

此扩展自 PHP 5.5.0 起已弃用,并将在未来删除。相反,应该使用MySQLiPDO_MySQL扩展。另请参阅MySQL:选择 API 指南相关的常见问题解答以获取更多信息。


编辑:

才意识到你GROUP BY case_id。如果两者,id53和 id139相同case_idMySQL 需要知道哪一行可以被丢弃。如果您不提供此信息,则或多或少会随机丢弃两行之一。

要解决此问题,请使用聚合函数。在您的情况下MIN(),将提供所需的结果。

使用 PHP heredoc 表示法清理了整个查询:

$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

如果是我,我会error_log() $follow_q 变量,然后将该查询复制并粘贴到 MySQL 中,看看它是否返回相同或错误的结果,因为您的 $current_date 变量可能是错误的。

于 2013-01-07T11:18:05.900 回答