2012-04-19 3 views
2

У меня есть следующий запрос:MySQL рассчитывает сложные результаты запроса?

$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"; 
} ?> 

$ Количество должно быть больше, чем 10, и мой PHP должен повторить нагрузки больше, но это не вторя ничего для загрузки.

В таблице такси выглядит следующим образом:

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 

Предполагая, что $ идент 1, запрос возвращает 1,3,4,5 сообщения дан (1 нравится, 3 не нравится и не нравится пользователям 1, 4 и 5 не нравятся и не нравятся никому). Поэтому счетчик $ должен содержать 4 (найдено 4 результата).

Если мой запрос неэффективен, как его адаптировать, чтобы быть эффективным?

В конечном счете, вопрос в том, как я могу сделать что-то вроде:

if ($count > 10) {} 
+0

SELECT COUNT (*) должен работать с запросом. Какое сообщение об ошибке вы получаете? –

+1

Как насчет mysql_num_rows – SuperNoob

+0

Как и в случае с SuperNoob, мне легче возвращать num_rows, чем использовать mysql COUNT –

ответ

3

Ваша проблема в том, что ваш запрос не возвращает то, что, по вашему мнению, он возвращает (он всегда помогает выполнить запрос автономно, чтобы увидеть, его результат - это то, что вы ожидаете).

Правильно, давайте сломаем это.

Считает все посты, которые пользователю не понравилось или не понравилось. симпатии и антипатии хранятся в столике такси. taxi.taxiID отвечает post.ID. Следовательно, если идентификатор пользователя с любым значением, которое не является нулевым, будет найдено, игнорируйте этот post.ID. Я рассчитываю, что тот post.ID, которые не игнорировало

Вы пытаетесь сосчитать все посты, которые сделать не иметь запись соответствия в таблице такси, для этого идентификатора пользователя. Здесь вы должны указать JOIN таблицы и получить эти строки в 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.

Если запустить этот запрос и получить ожидаемый набор строк (сообщений, которые не имеют симпатий или антипатий от этого пользователя), то вы можете добавить внешний запрос, чтобы подсчитать количество возвращаемых строк:

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 } 

(второй редактировать) Этот внутренний запрос получит Вас те сообщения, которые имеют либо значение = 1 в таблице такси, или никакой ценности, которые результаты возвращаются в качестве примера для вашего примера:

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 
+0

Вы также можете просто запустить его как внутренний запрос с помощью 'COUNT (*) как count', заменяющего' * ', но я не помню, как это взаимодействует с предложением HAVING. –

+0

Это не работает. Результаты не найдены. См. Обновленный вопрос с раскладкой таблиц такси и столов. Предполагая, что $ user равно 1, запрос должен найти postID 1,3,4,5, поэтому счет должен быть 4. Ваше решение приводит к тому, что счет равен 0. – Sweepster

+0

Я исправил и отредактировал SQL, загрузив данные в тестовую базу данных и выполнив Это. Основное отличие состоит в том, что тест для userID переместился в предложение ON LEFT JOIN, и тест на значение IS NULL был удален (я рекомендую ограничение NOT NULL в этом столбце). Вы найдете, что правильный ответ для $ user = 1 на самом деле равен 3, поскольку они сделали значения для postIDs 1 и 2. –

0
SELECT COUNT(*) FROM post 
WHERE postID NOT IN      
    (SELECT taxiID 
    FROM taxi 
    WHERE userID = '.$userID.' 
     AND value = 0 
) 
ORDER BY postID; 
+0

как опубликовано в моем вопросе, COUNT не работает – Sweepster

+0

см. Обновленный вопрос – Sweepster

0
SELECT COUNT(*) FROM post 
WHERE postID NOT IN      
    (SELECT taxiID 
    FROM taxi 
    WHERE userID = '.$userID.' 
     AND value = 0 
) 

Вы можете также предоставить нам сообщение об ошибке, если это не работает?

+0

Я получаю массив. Мне нужно числовое значение. – Sweepster

+0

Вы должны иметь возможность инициализировать переменную с целым значением вашего счета непосредственно из возвращаемого массива. – kjones

+0

см. Обновленный вопрос. – Sweepster

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 записей. Не уверен, что это идея.

+0

Вы правы, если забыли удалить LIMIT. Однако COUNT не работает. – Sweepster

+0

см. Обновленный вопрос – Sweepster

+0

@ Джонатан Да, счет работает отлично. Вы перепутали свой PHP-код, который вы не предоставили. –

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

0

Я нашел ответ, и он был мертв прост:

if (count($count) > 10) {} 
+0

Это действительно очень неэффективный способ сделать это, да. Просто причина, по которой это работает, не означает, что это правильно. –

+0

Я согласен, но без решения моего запроса у меня нет альтернативы. – Sweepster

Смежные вопросы