У меня есть следующий запрос:
$count = (SELECT COUNT(*) FROM post GROUP BY ID HAVING ID NOT IN (SELECT taxiID FROM taxi WHERE userID = '.$userID.' AND value IS NOT NULL) ORDER BY postID), OBJECT);
В графе содержится следующее:
count = Array ( [0] => stdClass Object ( [COUNT(*)] => 1 ) [1] => stdClass Object ( [COUNT(*)] => 1 ) [2] => stdClass Object ( [COUNT(*)] => 1 ) [3] => stdClass Object ( [COUNT(*)] => 1 ) [4] => stdClass Object ( [COUNT(*)] => 1 ) [5] => stdClass Object ( [COUNT(*)] => 1 ) [6] => stdClass Object ( [COUNT(*)] => 1 ) [7] => stdClass Object ( [COUNT(*)] => 1 ) [8] => stdClass Object ( [COUNT(*)] => 1 ) [9] => stdClass Object ( [COUNT(*)] => 1 ) [10] => stdClass Object ( [COUNT(*)] => 1 ) [11] => stdClass Object ( [COUNT(*)] => 1 ) [12] => stdClass Object ( [COUNT(*)] => 1 ) [13] => stdClass Object ( [COUNT(*)] => 1 ) [14] => stdClass Object ( [COUNT(*)] => 1 ) [15] => stdClass Object ( [COUNT(*)] => 1 ) [16] => stdClass Object ( [COUNT(*)] => 1 ) [17] => stdClass Object ( [COUNT(*)] => 1 ) [18] => stdClass Object ( [COUNT(*)] => 1 ) [19] => stdClass Object ( [COUNT(*)] => 1 )
Мне нужно подсчитать количество результатов, указанных выше. Дело в том, что я не знаю, как использовать результат!
У меня был этот код, но теперь он не будет работать:
<?php if($count[0]->{'COUNT(*)'} > 10){ ? echo "Load More"; }else { echo "Nothing to load"; } ?>
$ count должно быть больше 10, а мой php должен эхо загрузить Load More, но он эхом ничего не загружает.
Стол такси выглядит так:
ID taxiID userID value 1 1 1 1 2 1 6 1 3 1 4 0 4 2 1 0 5 2 6 1 6 2 4 0 7 3 6 1 8 3 4 0
Столбец выглядит так:
ID postID randomNum 1 1 564 2 2 789 3 3 234 4 4 845 5 5 089
Предполагая, что $ userID равен 1, запрос возвращает postID 1,3,4,5 (1 нравится, 3 не нравится и не нравится пользователям 1, 4 и 5 не нравятся и не нравятся никому). Поэтому счетчик $ должен содержать 4 (найдено 4 результата).
Если мой запрос неэффективен, как я могу его эффективно адаптировать?
В конечном итоге возникает вопрос: как мне сделать что-то вроде:
if ($count > 10) {}
Ваша проблема заключается в том, что ваш запрос не возвращает то, что, по вашему мнению, он возвращает (он всегда помогает выполнить запрос автономно, чтобы убедиться, что результирующий набор является тем, что вы ожидаете).
Правильно, давайте сломаем это.
Он подсчитывает все сообщения, которые пользователь не любил или не любил. симпатии и антипатии хранятся в столике такси. taxi.taxiID отвечает post.ID. Следовательно, если идентификатор пользователя с любым значением, которое не является нулевым, будет найдено, игнорируйте этот post.ID. Я считаю, что эти post.ID, которые не игнорируются
Вы пытаетесь подсчитать все записи, которые не имеют соответствующей записи в таблице такси, для этого идентификатора пользователя. Здесь вы хотите присоединиться к таблицам и получить эти строки в post
, которые обычно будут исключены из соединения. Это достигается левым внешним соединением
( отредактировано )
SELECT p.ID, t.taxiID FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.' HAVING t.taxiID IS NULL
Это предложение HAVING
говорит: только те строки в наборе результатов, у которых не было соответствующего t.taxiID.
Если вы запустите этот запрос и получите ожидаемый набор строк (сообщения, которые не имеют симпатий или антипатий к этому пользователю) THEN вы можете добавить внешний запрос для подсчета количества возвращенных строк:
SELECT COUNT(*) as count FROM ( SELECT p.ID, t.taxiID FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.' HAVING t.taxiID IS NULL ) a
Это должно возвращать один скаляр с именем count. В этом случае вы сможете сказать:
if ($count[0]->count > 10) { blah blah blah }
( 2nd edit ) Этот внутренний запрос доставит вам те сообщения, которые имеют значение = 1 в таблице такси или вообще не имеют значения, что приводит к возврату 4 для вашего примера:
SELECT p.ID, t.taxiID, t.value FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.' HAVING t.taxiID IS NULL OR t.value = 1
Если вы хотите узнать, сколько результатов было бы возвращено без предложения LIMIT, согласно документации MySQL:
Оператор SELECT может включать предложение LIMIT, чтобы ограничить количество строк, которые сервер возвращает клиенту. В некоторых случаях желательно знать, сколько строк оператор должен был бы вернуть без LIMIT, но без повторного запуска оператора. Чтобы получить этот счетчик строк, включите опцию SQL_CALC_FOUND_ROWS в инструкции SELECT и затем вызовите FOUND_ROWS ():
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
SELECT COUNT(*) FROM post WHERE postID NOT IN ( SELECT taxiID FROM taxi WHERE userID = '.$userID.' AND value = 0 ) ORDER BY postID;
SELECT COUNT(*) FROM post WHERE postID NOT IN ( SELECT taxiID FROM taxi WHERE userID = '.$userID.' AND value = 0 )
Можете ли вы также предоставить нам сообщение об ошибке, если это не сработает?
Почему не это?
SELECT COUNT(*) FROM post WHERE postID NOT IN ( SELECT taxiID FROM taxi WHERE userID = '.$userID.' AND value = 0 ) LIMIT 10
Обратите внимание, что нет необходимости выполнять order by
если вы ищете только счет. Также обратите внимание, что у вас есть limit
поэтому в результате не будет более 10 записей. Не уверен, что это идея.
Я нашел ответ, и все было просто:
if (count($count) > 10) {}