powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с подсчётом - как написать?
12 сообщений из 12, страница 1 из 1
Запрос с подсчётом - как написать?
    #33137246
Sly_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеются две следующие таблицы:

CREATE TABLE `predmet` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(16) NOT NULL default '',
PRIMARY KEY (`id`)
);

INSERT INTO `predmet` VALUES (1, 'Первый');
INSERT INTO `predmet` VALUES (2, 'Второй');

CREATE TABLE `color` (
`id` int(11) NOT NULL auto_increment,
`predmet` int(11) NOT NULL default '0',
`name` varchar(16) NOT NULL default '',
PRIMARY KEY (`id`)
);

INSERT INTO `color` VALUES (1, 1, 'синий');
INSERT INTO `color` VALUES (2, 1, 'красный');

---

Смысл в том, что есть предметы, а есть цвета. Причём, не у каждого предмета есть цвет, а если есть, то цветов может быть несколько.
В данном примере у предмета "Первый" 2 цвета, у предмета "Второй" ни одного.

Мне нужно получить список вида:

id предмета; имя предмета; кол-во цветов у предмета

Если я пишу
SELECT predmet.id,predmet.name,COUNT(color.id) FROM predmet,color WHERE color.predmet=predmet.id GROUP BY predmet.id

то получаю только:

id name COUNT(color.id)
1 Первый 2

потому что у второго предмета нет цветов в таблице color, и не выполняется условие color.predmet=predmet.id

Как правильно написать запрос, чтобы он выводил такое:
id name COUNT(color.id)
1 Первый 2
2 Второй 0

То есть, если цвета есть - тогда их кол-во, иначе - ноль.

Я понимаю, можно каждому предмету назначить цвет, дефолтный, и считать кол-во цветов - 1, но в моей задаче это неудобно. Да и вообще интересно узнать ответ, в принципе.
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33137318
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sly_GДа и вообще интересно узнать ответ, в принципе.
Ну раз впринципе интересно, что ж, лови ответ :)

SELECT predmet.id,predmet.name,COUNT(color.id) FROM predmet LEFT OUTER JOIN color ON (color.predmet=predmet.id) GROUP BY predmet.id;
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33137416
Welly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sly_GЕсли я пишу
SELECT predmet.id,predmet.name,COUNT(color.id) FROM predmet,color WHERE color.predmet=predmet.id GROUP BY predmet.id

Не в качестве наезда, но вот интересно, откуда такой стиль объединения таблиц, через условие, а не явное указание JOIN? Причем такие вопросы задаются с пугающей регулярностью. Ничего не понимаю, это так в ВУЗах учат? Или виноваты учебники по SQL, недочитанные до середины?
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33137456
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автороткуда такой стиль объединения таблиц, через условие, а не явное указание JOIN?
я, например, тоже в таком же стиле пишу, наверное по привычке. Начинал с oracle 7 -го, а там join-ов небыло. И сейч. в oracle не исп. join-ы , а исп. знак (+) , за исключением единственного случая full outer join ( по захвату неопр. значений слева и справа одновременно ) Так объединение 2х таблиц через join выглядит красиво, но 3х или 4х через join-ы лично меня уже путают :) Кстати если заглянуть в оракловый форум, там почти все такие
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33137581
Sly_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Welly Sly_GЕсли я пишу
SELECT predmet.id,predmet.name,COUNT(color.id) FROM predmet,color WHERE color.predmet=predmet.id GROUP BY predmet.id

Не в качестве наезда, но вот интересно, откуда такой стиль объединения таблиц, через условие, а не явное указание JOIN? Причем такие вопросы задаются с пугающей регулярностью. Ничего не понимаю, это так в ВУЗах учат? Или виноваты учебники по SQL, недочитанные до середины?

Это необходимость что-то срочно делать по работе без достаточного времени для того, чтобы учебники читать.
Это дело хорошее, только где взять время на него.

А в вузе меня SQL не учили, специальность другая была.
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33137583
Sly_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sanek842 Sly_GДа и вообще интересно узнать ответ, в принципе.
Ну раз впринципе интересно, что ж, лови ответ :)

SELECT predmet.id,predmet.name,COUNT(color.id) FROM predmet LEFT OUTER JOIN color ON (color.predmet=predmet.id) GROUP BY predmet.id;

Спасибо большое!
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33137914
Welly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я, например, тоже в таком же стиле пишу, наверное по привычке. Начинал с oracle 7 -го

Ну это понятно. Правда, бывшие ораклисты вопросов не задают, где видно незнание видов JOIN. Да и кроме INNER/OUTER JOIN, другие варианты в MySQL придется писать явно :)


Так объединение 2х таблиц через join выглядит красиво, но 3х или 4х через join-ы лично меня уже путают
Да 3-4-n тоже выглядят красиво и понятно, если отформатировать.
Я, например, вот так выстраиваю и не путаюсь:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT 
   predmet.id,
   predmet.name,
   COUNT(color.id) 
FROM 
   predmet 
   LEFT JOIN color ON color.predmet=predmet.id 
   LEFT JOIN something ON conditions
GROUP BY 
  predmet.id


Это необходимость что-то срочно делать по работе без достаточного времени для того, чтобы учебники читать.
Печально... Неужели у всех так, кто подобные вопросы задает на форуме? Какой-то FAQ в стиле курса молодого бойца надо, что ли. В дополнение к Cook Room. :)
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33138112
Sly_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sanek842Ну раз впринципе интересно, что ж, лови ответ :)

SELECT predmet.id,predmet.name,COUNT(color.id) FROM predmet LEFT OUTER JOIN color ON (color.predmet=predmet.id) GROUP BY predmet.id;

Работает, но как-то заметно долго. 1000 предметов и 500 цветов, запрос секунд 5 обрабатывает.

Один вариант - это в таблице predmet сделать отдельный столбец для количества цветов предмета и его обновлять.

А второй вариант - индексы сделать. Какие индексы в данном случае правильно сделать?
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33138404
Welly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sly_GОдин вариант - это в таблице predmet сделать отдельный столбец для количества цветов предмета и его обновлять.

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


А второй вариант - индексы сделать. Какие индексы в данном случае правильно сделать?
ИМХО, проще, и работает на всех видах таблиц
ALTER TABLE color ADD INDEX fk_predmet_idx(predmet);
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33143366
Sly_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Welly Sly_GОдин вариант - это в таблице predmet сделать отдельный столбец для количества цветов предмета и его обновлять.

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


Да, этого и боюсь.


А второй вариант - индексы сделать. Какие индексы в данном случае правильно сделать?
ИМХО, проще, и работает на всех видах таблиц
ALTER TABLE color ADD INDEX fk_predmet_idx(predmet);[/quot]

Ага, то есть просто по предметам..
Ух ты, в десятки раз ускорился. Круто.

Не, это не дело - надо книгу читать умную Ж)
Можете посоветовать книжку хорошую, на русском, по этим вопросам? Не совсем mysql с нуля изучать,- больше про оптимизацию, хитрые запросы...
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33144122
Welly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sly_GНе, это не дело - надо книгу читать умную Ж)
Можете посоветовать книжку хорошую, на русском, по этим вопросам? Не совсем mysql с нуля изучать,-
По MySQL:
Поль Дюбуа. MySQL. Second Edition

По SQL (пусть вас слово "Введение" не обманывает, книга серьезная):
Мартин Грабер. Введение в SQL

больше про оптимизацию, хитрые запросы...
Увы, не могу ничего посоветовать, давно уже читаю только статьи и форумы в инете. Ну и практикуюсь постоянно :)
...
Рейтинг: 0 / 0
Запрос с подсчётом - как написать?
    #33146384
Sly_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Welly
По MySQL:
Поль Дюбуа. MySQL. Second Edition

По SQL (пусть вас слово "Введение" не обманывает, книга серьезная):
Мартин Грабер. Введение в SQL



Купил вчера Дюбуа, "mysql Сборник рецептов". Толково написано.
Постараюсь найти указанную вами книжку.
Спасибо!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с подсчётом - как написать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]