У меня есть следующий запрос MySQL:
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
то задано в столбце p.categories
, но строка в таблице productCategory
не существует productCategory
, но статус в строке productCategory
равен 'D' p.categories
p.categories
– это строка с числовыми значениями, разделенными пробелом, представляющими идентификаторы в таблице productCategory
. Не лучший дизайн, предоставленный, но мне была дана эта задача, поэтому нам нужен способ сделать это.
В PHP-коде этот запрос выполняется непосредственно после этого:
SELECT FOUND_ROWS() as count
Когда выполняется из phpmyadmin, я возвращаю тысячи строк, и когда я добавляю второй запрос, я получаю значение количества правильного количества строк. Когда я выполняю тот же самый первый запрос через mysqli_query (), я не получаю никаких строк вообще, а следующий запрос возвращает число 1.
Оба phpmyadmin и мой PHP-код подключаются к одной базе данных.
Кто-нибудь может понять, что происходит?
Обновить:
Я хочу, чтобы первые 30 строк были возвращены, потому что в следующем запросе может быть огромное количество, я должен получить подсчет того, что это за сумма, а значит, SQL_CALC_FOUND_ROWS после первого SELECT.
Вы должны выполнить первый запрос только для того, чтобы получить набор записей, возвращаемый PHP. Вы можете рассчитывать на свой PHP после его появления. Вы не должны передавать конкатенированные запросы от PHP к MySQL.
т.е.
$result = mysql_query($query); $recordCount = mysql_num_rows($result);
По какой-то причине изменение первой строки запроса:
SELECT SQL_CALC_FOUND_ROWS p.*
Для того, чтобы:
SELECT SQL_CALC_FOUND_ROWS p.id
И затем, перебирая результаты, получающие данные, которые мне нужны из каждой строки в отдельных запросах, получил результат, который я получил после.