SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.08.2013 17:02:21

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Объединение двух запросов, в одном из которых COUNT(*).

Здравствуйте! Помогите пожалуйста объединить два таких запроса в один.

SELECT `login` FROM `users` WHERE `id` = '11';

SELECT COUNT(*) FROM `images` WHERE `user_id` = '11';


Не могу понять как с COUNT(*) объединять.

Сделал вот, так, но это не правильно работает, что и не удивительно, просто экспериментировал.

SELECT `users`.`login`, COUNT(*) FROM `users` JOIN `images` ON `users`.`id` = '11' AND `images`.`user_id` = '11';


Вот что получается:

mysql> SELECT `users`.`login`, COUNT(*) FROM `users` JOIN `images` ON `users`.`id` = '11' AND `images`.`user_id` = '11';
+-------+----------+
| login | COUNT(*) |
+-------+----------+
| Mac   |       16 |
+-------+----------+
1 row in set (0.00 sec)

mysql> SELECT `users`.`login`, COUNT(*) FROM `users` JOIN `images` ON `users`.`id` = '12' AND `images`.`user_id` = '12';
+---------+----------+
| login   | COUNT(*) |
+---------+----------+
| Romikov |        1 |
+---------+----------+
1 row in set (0.00 sec)

mysql> SELECT `users`.`login`, COUNT(*) FROM `users` JOIN `images` ON `users`.`id` = '13' AND `images`.`user_id` = '13';
+-------+----------+
| login | COUNT(*) |
+-------+----------+
| NULL  |        0 |
+-------+----------+
1 row in set (0.00 sec)


Тоесть, если у пользователя нет публикаций, то в результате вместо его логина стоит NULL

Помогите правильно сделать, и если можно с пояснениями, что бы я понял как такие запросы объединять.

Неактивен

 

#2 16.08.2013 17:29:50

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Объединение двух запросов, в одном из которых COUNT(*).

Чтобы не было NULL, используйте LEFT JOIN

SELECT `users`.`login`, COUNT(images.id) FROM `users` LEFT JOIN `images` ON `images`.`user_id` = `users`.`id` WHERE `users`.`id`=12 GROUP BY `users`.`id`;

Неактивен

 

#3 16.08.2013 17:49:27

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

Тогда получается чтобы вывести список всех пользователей и количество их публикаций, нужно сделать так?

SELECT `users`.`login`, COUNT(images.id) FROM `users` LEFT JOIN `images` ON `images`.`user_id` = `users`.`id`
GROUP BY `users`.`id`;

Отредактированно Debian (16.08.2013 17:50:35)

Неактивен

 

#4 16.08.2013 18:08:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Объединение двух запросов, в одном из которых COUNT(*).

Да, верно

Неактивен

 

#5 16.08.2013 18:10:31

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

А как тогда вывести только тех, у кого публикаций, больше 0, и отсортировать по колонке count?

Неактивен

 

#6 16.08.2013 18:33:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Объединение двух запросов, в одном из которых COUNT(*).

SELECT `users`.`login`, COUNT(images.id) c FROM `users` LEFT JOIN `images` ON `images`.`user_id` = `users`.`id` GROUP BY `users`.`id` HAVING c>0 ORDER BY c DESC;

Вам поможет книга MySQL Ceritfication Guide.

Неактивен

 

#7 16.08.2013 18:43:19

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

Большое спасибо smile

Вам поможет книга MySQL Ceritfication Guide.

Я бы и рад, но не настолько хорошо знаю English, чтобы на нем читать, приходится довольствоваться MySQL 5 в подлиннике, но он больше как справочник, чем самоучитель, там плохо объясняют, по крайней мере мне тяжело понять по этой книге.
Использую как справочник, когда нужно быстро вспомнить то что уже знаю, но подзабыл синтаксис и т.д.

Отредактированно Debian (16.08.2013 18:43:52)

Неактивен

 

#8 16.08.2013 18:46:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Объединение двух запросов, в одном из которых COUNT(*).

Рекомендую ее,
она вполне себе на русском языке, и mysql там тоже рассматривается.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 16.08.2013 18:51:25

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

Что то не работает ваш запросик sad

У вас там была пропущена кавычка, я её дописал, но все равно ошибка.

mysql> SELECT `users`.`login`, COUNT(images.id) c FROM `users` LEFT JOIN `images` ON `images`.`user_id` = `users`.`id` GROUP BY `users`.`id` HAVING c>0 GROUP BY c DESC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY c DESC' at line 1

Неактивен

 

#10 16.08.2013 18:53:31

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

deadka написал:

Рекомендую ее,
она вполне себе на русском языке, и mysql там тоже рассматривается.

А у меня есть такая книга, что хорошая? Нужно будет почитать smile Я думал там только готовые специфические рецепты.

У меня вообще все книги, O'Reilly которые были на русский переведены, и относятся к web есть, в цифровом варианте, так дешевле и удобнее, чем покупать книги.

Отредактированно Debian (16.08.2013 18:55:59)

Неактивен

 

#11 16.08.2013 18:55:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Объединение двух запросов, в одном из которых COUNT(*).

Прошу прощения - исправил еще одну опечатку - в конце ORDER BY

Неактивен

 

#12 16.08.2013 18:57:38

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

rgbeast написал:

Прошу прощения - исправил еще одну опечатку - в конце ORDER BY

Ага, спасибочки, теперь работает.

Неактивен

 

#13 16.08.2013 19:00:28

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Объединение двух запросов, в одном из которых COUNT(*).

Debian написал:

deadka написал:

Рекомендую ее,
она вполне себе на русском языке, и mysql там тоже рассматривается.

А у меня есть такая книга, что хорошая? Нужно будет почитать smile Я думал там только готовые специфические рецепты.

У меня вообще все книги, O'Reilly которые были на русский переведены, и относятся к web есть, в цифровом варианте, так дешевле и удобнее, чем покупать книги.

Да, хорошая, много ценных вещей описано. Насчет того в чем читать - уже сами смотрите smile, при наличии электронной книге на 9.7 дюйма необходимость бумажной литературы сильно падает )).

Следом обязательно стоит ознакомиться с http://www.ozon.ru/context/detail/id/7598812/
SQLInfo рекомендует smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#14 16.08.2013 19:00:50

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

А может мне кто нибудь помочь, до конца уже вот в этой теме разобраться, а то хотелось бы доделать.

http://sqlinfo.ru/forum/viewtopic.php?pid=37475#p37475

Неактивен

 

#15 16.08.2013 19:15:25

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

deadka написал:

Debian написал:

deadka написал:

Рекомендую ее,
она вполне себе на русском языке, и mysql там тоже рассматривается.

А у меня есть такая книга, что хорошая? Нужно будет почитать smile Я думал там только готовые специфические рецепты.

У меня вообще все книги, O'Reilly которые были на русский переведены, и относятся к web есть, в цифровом варианте, так дешевле и удобнее, чем покупать книги.

Да, хорошая, много ценных вещей описано. Насчет того в чем читать - уже сами смотрите smile, при наличии электронной книге на 9.7 дюйма необходимость бумажной литературы сильно падает )).

Следом обязательно стоит ознакомиться с http://www.ozon.ru/context/detail/id/7598812/
SQLInfo рекомендует smile.

Спасибо гляну, у меня эти книги в формате ebook тоесть в идеальном качестве, с них можно книги печатать. Там быстрее через поиск искать нужный материал, чем листать книгу. К томуже у меня уже этих книг по программированию и вообще по IT так много, в бумажном варианте, что уже полки трещат по швам, некоторые из них видно у меня на аватарке ))

Неактивен

 

#16 19.08.2013 17:10:52

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

Помогите еще пожалуйста smile Добавил новое поле status в таблицу images.

Вот, тот запросик который вы мне объединили.

mysql> SELECT `users`.`login`, COUNT(`images`.`id`) AS `count` FROM `users`
    -> LEFT JOIN `images` ON `images`.`user_id` = `users`.`id`
    -> WHERE `users`.`id` = '11' GROUP BY `users`.`id`;
+-------+-------+
| login | count |
+-------+-------+
| Mac   |     2 |
+-------+-------+
1 row in set (0.00 sec)

А теперь еще хотелось бы в этот же результат выборки добавить третье поле в котором будет количество изображений со статусом 1. Чтобы получилось вот так:

+-------+-------+-------+
| login | count | count2|
+-------+-------+-------+
| Mac   |     2 |     1 |
+-------+-------+-------+

Смысл в том чтобы в итоге вывести: Вы загрузили изображений: 2 (1 из которых ожидает подтверждения).
Если можно, перепишите пожалуйста запрос.

Неактивен

 

#17 21.08.2013 00:33:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение двух запросов, в одном из которых COUNT(*).

SELECT `users`.`login`, `count` FROM `users`
     LEFT JOIN (SELECT `user_id`, COUNT(`images`.`id`) AS `count` FROM `images` WHERE `images`.`user_id`=11 GROUP BY `images`.`user_id`) t ON `t`.`user_id` = `users`.`id`; -- ещё один left join добавить

Неактивен

 

#18 21.08.2013 00:34:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение двух запросов, в одном из которых COUNT(*).

`users`.`id` = '11'
почему строка?

Неактивен

 

#19 21.08.2013 05:10:36

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

Ваш запрос возвращает вот что:

mysql> SELECT `users`.`login`, `count` FROM `users`
    ->      LEFT JOIN (SELECT `user_id`, COUNT(`images`.`id`) AS `count` FROM `i
mages` WHERE `images`.`user_id`=11 GROUP BY `images`.`user_id`) t ON `t`.`user_i
d` = `users`.`id`;
+---------+-------+
| login   | count |
+---------+-------+
| Mac     |    24 |
| Romikov |  NULL |
| Romik   |  NULL |
+---------+-------+
3 rows in set (0.00 sec)


Тоесть, я не понял, что вы этим запросом хотели показать, или объяснить, но он и старую задачу перестал выполнять, и новую задачу он не решает. И тот запрос, я понял, как он работает, а ваш вообще не пойму smile

Неактивен

 

#20 21.08.2013 10:19:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение двух запросов, в одном из которых COUNT(*).

SELECT `users`.`login`, `count`, `count2` FROM `users` LEFT JOIN
(SELECT user_id, COUNT(id) AS `count` FROM images WHERE user_id=11 GROUP BY 1) t ON `t`.`user_id` = `users`.`id`
LEFT JOIN
(SELECT user_id, COUNT(id) AS `count2` FROM images WHERE user_id=11 AND `status`=1 GROUP BY 1) t1 ON `t1`.`user_id` = `users`.`id`
WHERE `users`.`id` = 11;

Неактивен

 

#21 21.08.2013 15:07:41

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

Большое спасибо smile Теперь все работает.

mysql> SELECT `users`.`login`, `count`, `count2` FROM `users` LEFT JOIN
    -> (SELECT user_id, COUNT(id) AS `count` FROM images WHERE user_id=11 GROUP BY 1) t ON `t`.`user_id` = `users`.`id`
    -> LEFT JOIN
    -> (SELECT user_id, COUNT(id) AS `count2` FROM images WHERE user_id=11 AND `status`=1 GROUP BY 1) t1 ON `t1`.`user_id` = `users`.`id`
    -> WHERE `users`.`id` = 11;
+-------+-------+--------+
| login | count | count2 |
+-------+-------+--------+
| Mac   |    25 |      1 |
+-------+-------+--------+
1 row in set (0.00 sec)

mysql> explain SELECT `users`.`login`, `count`, `count2` FROM `users` LEFT JOIN
    -> (SELECT user_id, COUNT(id) AS `count` FROM images WHERE user_id=11 GROUP BY 1) t ON `t`.`user_id` = `users`.`id`
    -> LEFT JOIN
    -> (SELECT user_id, COUNT(id) AS `count2` FROM images WHERE user_id=11 AND `status`=1 GROUP BY 1) t1 ON `t1`.`user_id` = `users`.`id`
    -> WHERE `users`.`id` = 11;
+----+-------------+------------+-------+---------------+-------------+---------+-------------+------+-------------+
| id | select_type | table      | type  | possible_keys | key         | key_len | ref         | rows | Extra       |
+----+-------------+------------+-------+---------------+-------------+---------+-------------+------+-------------+
|  1 | PRIMARY     | users      | const | PRIMARY       | PRIMARY     | 4       | const       |    1 | NULL        |
|  1 | PRIMARY     | <derived2> | ref   | <auto_key0>   | <auto_key0> | 4       | const       |    2 | NULL        |
|  1 | PRIMARY     | <derived3> | ref   | <auto_key0>   | <auto_key0> | 4       | const       |    0 | NULL        |
|  3 | DERIVED     | images     | ref   | user_id       | user_id     | 5       | const,const |    1 | Using index |
|  2 | DERIVED     | images     | ref   | user_id       | user_id     | 4       | const       |   25 | Using index |
+----+-------------+------------+-------+---------------+-------------+---------+-------------+------+-------------+
5 rows in set (0.00 sec)

mysql>

Неактивен

 

#22 21.08.2013 17:34:46

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Объединение двух запросов, в одном из которых COUNT(*).

vasya написал:

`users`.`id` = '11'
почему строка?

Где-то когда то вычитал, что мол лучше все, что в переменных заключать в кавычки, кроме limit уже не помню почему, толи в целях безопасности толи еще что. Не стоит так делать? Только строковые данные в кавычки, остальное без?

Неактивен

 

#23 21.08.2013 18:04:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение двух запросов, в одном из которых COUNT(*).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson