结果在mysql和PHP中发生冲突

时间:2013-01-07 10:44:33

标签: php mysql

我面临一个奇怪的问题,如果我用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());

此查询为我提供了53, 84, 47, 36的ID。

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

更新:此处我更新了ID 53的结果

enter image description here

3 个答案:

答案 0 :(得分:1)

有关您的查询本身的一些提示:

您的follow_up_datetime类型应为timestamp or 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: choosing an API guiderelated FAQ


修改

刚认识到你GROUP BY case_id。 如果两者,id 53和id 139具有相同的case_id MySQL,则需要知道哪一行可以被丢弃。如果您不提供此信息,则两行中的一行或多或少随机丢弃。

要解决此问题,请使用aggregate function。在您的情况下,MIN()会提供所需的结果。

使用PHP heredoc notation清理整个查询:

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

答案 1 :(得分:0)

问题可能来自follow_up_status <= '1'。如果列是数字类型,则应将值作为数字传递,而不是字符串。尝试:

follow_up_status <= 1

答案 2 :(得分:0)

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