2010-01-27 111 views
1

我有以下MySQL查询:MySQL查询工作在phpMyAdmin中,但没有列在PHP中返回结果集

SELECT SQL_CALC_FOUND_ROWS p.* 
FROM product AS p 
LEFT JOIN productCategory AS c ON FIND_IN_SET(c.id, REPLACE(TRIM(p.categories), ' ',',')) 
WHERE (
    c.id IS NULL 
    OR c.status = 'D' 
    OR p.categories IS NULL 
    OR TRIM(p.categories) = '' 
) 
AND p.deprecated = 'N' 
LIMIT 0,30 

该查询拾起产品:

  • 有事在p.categories设置列,但productCategory表中的行不存在
  • productCategory行,但productCategory行的状态设置为'D'
  • 有没有在p.categories

p.categories设置是一行空间的分隔代表在productCategory表ID数值。不是最好的设计,但我已经完成了这项任务,所以需要一种做法。

在PHP代码,该查询被执行直接算账:

SELECT FOUND_ROWS() as count 

当从phpMyAdmin的执行,我得到数千行回来,当我追加的第二个查询,我得到正确的计数值行数。当我通过mysqli_query()执行相同的第一个查询,我没有得到任何排在所有返回,下面的查询返回的1

两个phpmyadmin的计数和我的PHP代码连接到同一个数据库。

任何人都可以看到出了什么问题?!

更新:

我只希望前30行返回,因为有可能是一个巨大的总数,在随后的查询中,我应该得到的是什么总将是一个数,因此后SQL_CALC_FOUND_ROWS第一个SELECT。

+0

尝试在每个语句后添加一个分号。 – 2010-01-27 14:38:11

+0

当通过PHP运行查询时,每个都通过mysqli_query()单独传递,所以不需要。在phpmyadmin中,是的,我用分号分隔它们。 – berty 2010-01-27 14:42:25

+0

旁注:您不能有效地存储类别,这种方式数据库引擎必须在** ALL **产品行上执行字符串替换功能。你应该有另一个表存储关系'post_id => category_id' ... – 2016-07-08 17:02:04

回答

0

出于某种原因,改变了查询的第一行:

SELECT SQL_CALC_FOUND_ROWS p.* 

要:

SELECT SQL_CALC_FOUND_ROWS p.id 

然后通过结果得到的数据我循环需要从单独的查询中得到我在之后的结果。

1

您只需执行第一个查询即可将记录集返回给PHP。一旦你拥有了它,你就可以计入你的PHP。您不应该将连接的查询从PHP传递到MySQL。

$result = mysql_query($query); 
$recordCount = mysql_num_rows($result); 
+0

这将包括结果中的所有行,我只想要最初的30个,因为可能会有一个巨大的数字,然后计算总数,因此SQL_CALC_FOUND_ROWS在第一个SELECT之后。顺便说一句:我没有连接查询,每个人都在单独调用mysqli_query()。 – berty 2010-01-27 14:44:08

+0

您应该将这些细节添加到您的问题中,因为如果他们知道所有这些详细信息,它将帮助人们回答它。 – Fenton 2010-01-28 08:05:47

相关问题