2012-06-05 4 views
1

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

SELECT sku, quantity, inventory.isbn13, author, title, pub_date, binding, 
     defect.defect, source, location from inventory 
     LEFT JOIN location ON inventory.location_id = location.location_id 
     LEFT JOIN source ON inventory.source_id = source.source_id 
     LEFT JOIN book ON inventory.isbn13 = book.isbn13 
     LEFT JOIN defect ON inventory.defect_id = defect.defect_id 
     LEFT JOIN book_condition ON book_condition.condition_id = defect.condition_id 
     WHERE quantity > '0' and location.location_id >= '986' and location.location_id <= '989' 
     ORDER BY inventory.location_id, sku 

, который работает отлично, но теперь мне нужно, чтобы показать общее количество книг для каждого идентификатора местоположения. Например, location_id 986 имеет 17 книг, location_id 987 имеет 34 книги и т. Д. Мне нужно запустить второй запрос, чтобы получить эту информацию, или есть способ сделать это в запросе, который у меня есть?
Благодаря Джим

+0

вы хотите получить эту информацию в контексте Вашего инвентаря или в более общем контексте «сколько книг есть в этом месте»? – Sebas

+0

Мне нужно показать общее количество книг для каждого выбранного местоположения (в этом случае 986 - 989) Спасибо – Jim

+0

, тогда проверьте мой ответ – Sebas

ответ

1

здесь вы идете:

SELECT 
    sku, 
    quantity, 
    inventory.isbn13, 
    author, 
    title, 
    pub_date, 
    binding, 
    defect.defect, 
    source, 
    location, 
    t.cnt 
FROM 
    inventory i 
     INNER JOIN 
      (
      SELECT 
       inventory.location_id, 
       COUNT(book.isbn13) as `cnt` 
      FROM inventory 
        LEFT JOIN book ON inventory.isbn13 = book.isbn13 
      GROUP BY inventory.location_id 
      ) t ON t.location_id = i.location_id 
     INNER JOIN location l  ON i.location_id = l.location_id 
     LEFT JOIN source   ON i.source_id = source.source_id 
     LEFT JOIN defect   ON i.defect_id = defect.defect_id 
     LEFT JOIN book_condition ON book_condition.condition_id = defect.condition_id 
WHERE 
    i.quantity > '0' 
AND l.location_id >= '986' 
AND l.location_id <= '989' 
+0

Извините за задержку при тестировании вашего примера, но когда я его запускаю, я получаю синтаксическую ошибку sql в *) как «cnt». Я не уверен, что такое книга. * Означает, можете ли вы объяснить немного, чтобы я мог исправить ошибку и снова попробовать код ?. Спасибо – Jim

+0

Книга - это книжный стол, мне все еще интересно, почему существует синтаксическая ошибка, проверка stll ... – Sebas

+0

Я сделал несколько изменений и сменил книгу. * На book.title и, похоже, работает. Мне все еще нужно проверить математику, но на первый взгляд она выглядит близко. Спасибо за помощь. – Jim

0

Похоже, вы должны использовать групповую By и Count()

(это будет другой запрос от курса)

При использовании Count() и Группа по - убедитесь, что вы не включаете в столбцы Select, которые не могут быть агрегированы ...

0

Возможно, это может быть сделано с использованием SQL-запроса, но вы также можете сделать это с помощью PHP-кода. Перебор результатов и подсчет итогов, что-то вроде этого:

foreach ($results as $row) { 
    $location_count [$row['location_id']]++; 
} 
echo $location_count [986]; // outputs 17 
0
SELECT count(*), sku, quantity, inventory.isbn13, author, title, pub_date, binding, 
     defect.defect, source, location from inventory 
     LEFT JOIN location ON inventory.location_id = location.location_id 
     LEFT JOIN source ON inventory.source_id = source.source_id 
     LEFT JOIN book ON inventory.isbn13 = book.isbn13 
     LEFT JOIN defect ON inventory.defect_id = defect.defect_id 
     LEFT JOIN book_condition ON book_condition.condition_id = defect.condition_id 
     WHERE quantity > '0' and location.location_id >= '986' and location.location_id <= '989' 
     ORDER BY inventory.location_id, sku 
     GROUP BY location.location_id 
+0

Спасибо за сообщение, но это возвращает только последнее место с общим количеством записей в результаты запроса. – Jim

0

вы можете использовать функцию MySql «FOUND_ROWS», не влияют или изменить его критерии, посмотрите на мой местный пример.

mysql> select * from actor where actor_id>190; 
+----------+------------+-------------+---------------------+ 
| actor_id | first_name | last_name | last_update   | 
+----------+------------+-------------+---------------------+ 
|  191 | GREGORY | GOODING  | 2012-05-22 15:12:26 | 
|  192 | JOHN  | SUVARI  | 2012-05-22 15:12:26 | 
|  193 | BURT  | TEMPLE  | 2012-05-22 15:12:26 | 
|  194 | MERYL  | ALLEN  | 2012-05-22 15:12:26 | 
|  195 | JAYNE  | SILVERSTONE | 2012-05-22 15:12:26 | 
|  196 | BELA  | WALKEN  | 2012-05-22 15:12:26 | 
|  197 | REESE  | WEST  | 2012-05-22 15:12:26 | 
|  198 | MARY  | KEITEL  | 2012-05-22 15:12:26 | 
|  199 | JULIA  | FAWCETT  | 2012-05-22 15:12:26 | 
|  200 | THORA  | TEMPLE  | 2012-05-22 15:12:26 | 
|  205 | 1   | 2   | 0000-00-00 00:00:00 | 
|  206 | a   | b   | 0000-00-00 00:00:00 | 
+----------+------------+-------------+---------------------+ 
12 rows in set (0.00 sec) 

mysql> select FOUND_ROWS(); 
+--------------+ 
| FOUND_ROWS() | 
+--------------+ 
|   12 | 
+--------------+ 
1 row in set (0.00 sec) 

Эта функция даст вам номер строки последнего запроса.

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