我面临一个奇怪的问题,如果我用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
此查询的结果是:
但是当我使用与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
的结果
答案 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起,此扩展名已弃用,将来会被删除。相反,应使用MySQLi或PDO_MySQL扩展名。有关详细信息,另请参阅MySQL: choosing an API guide和related 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变量可能是错误的。