Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SQL запрос с подсчетом строк и другими операциями  (Прочитано 14657 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alisandres
Гость
« : 15-07-2010 13:40 » 

День добрый!
У меня есть две таблицы: tabl1 и tabl2 в MySQL и/или MSSQL
Структура tabl1:
id name par1 par2 parn
1 АААА     1    5       12
2 BBBB     2    30      8
3 CCCC    4    15       10

Структура tabl2:
id name type
1  uuu     1
2  bbb     2
3  yyy      3
4  dad     1
5  уйк      2
6  dwd     3
7  ewe     2
8   2eqe   3

Подробней, допустим: tabl1 это таблица авторов, у которых есть некие параметры (родной город (par1), стиль написания (par2) и прочее (parn)), в таблице  tabl2 содержится значение этих данных с именованием: id - номер записи, подставляемый в имена параметров, name- значение параметра,type - тип параметра ( тип 1, это родной город, тип 2 этостиль написания ...)

Требуется при выводе всех типов параметров (select * FROM tabl2)  из  tabl2: посчитать количество авторов (строк в таблице  tabl1:)   у которых то или иное значение задействовано. Конкретно: у нас есть запись с id 1, именем Санкт-Петербург и типом параметра 1 (что означает город), такой город буде ту нас у 10 авторов, нужно получить массив:
id  name  type count
1   СПБ       1    10

Вот как-то так... Здесь была моя ладья...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 15-07-2010 18:30 » 

Думаю, что то типа этого
Код: (SQL)
SELECT Z.id AS ID, z.name AS Name, z.TYPE AS TYPE, COUNT(1) AS COUNT
FROM tabl1 AS A,  (SELECT * FROM tabl2 WHERE TYPE = 1) AS Z
WHERE Z.id = A.par1
GROUP BY Z.id;
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 15-07-2010 18:39 » 

group by нужно делать по все полям.

Я фигею от постанавки задачи.

Имею А, Б, В
Хочу Г, Д, Е
А=Д, В=Г
а ты сиди сопоставляй.

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 15-07-2010 18:44 » new

Sla, Зачем? id  точно уникально и соответствует названию города. Если у него будет один и тот же город под разными id, это его проблема.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 15-07-2010 20:09 » 

Finch, а ты попробуй
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alisandres
Гость
« Ответ #5 : 16-07-2010 03:59 » 

Sla id уникально, что записано под name это роли не играет, хоть Санкт-Петербург, хоть санктпетербург... и при постановки задачи я расписал как можно точнее что бы было проще.

Finch это вложенный запрос? Может проще в цикле делать отдельно запросы на подсчет?
Записан
Alisandres
Гость
« Ответ #6 : 16-07-2010 07:35 » 

Делаю вывод что ни чего не получиться, потому что каждому числовому параметру type из 2 таблицы соответствует своя именованная колонка в 1 таблице. Если только считать строки по всей 1 таблице исключая поле id. Или переделать структуру базы данных к одному виду (числа или имена). Ваши мнения господа?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 16-07-2010 07:48 » 

Alisandres, какое ты хочешь мнение?

Покажи реальные данные.
Сформулируй вопрос.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 16-07-2010 10:17 » 

Что-то я насчёт цикла не понял. Finch предложил разумное решение.

Цитата: Alisandres
Делаю вывод что ни чего не получиться, потому что каждому числовому параметру type из 2 таблицы соответствует своя именованная колонка в 1 таблице.
С этого и начинать надо было. Задача получения "шахматки" или развёртывания строк в столбцы (перекрёстный запрос) - классическая. Решается при помощи динамических запросов (текст которых автоматически вычисляется).

У тебя задача обратная. Однако решается тоже при помощи динамических запросов. Если тебя даже вложенные запросы напрягают, то - да, лучше циклами пиши. Так тебе понятнее будет.

К тому же ты не сказал, какой СУБД пользуешься.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #9 : 18-07-2010 12:24 » 

Sla, Зачем? id  точно уникально и соответствует названию города. Если у него будет один и тот же город под разными id, это его проблема.

Sla имеет в виду, что в group by должны быть перечислены все поля из селекта, кроме аггрегатных. иначе непонятно, какие значения других полей выводить для группировочного поля.
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 18-07-2010 15:22 » 

x77, Будет подцепляться первое встреченное значение. Так как все остальные поля напрямую зависят от id и если не делать групировку то все строки при одинаковом id будут эквивалентны, то я не вижу разници между первой и другой любой строкой.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 18-07-2010 17:50 » 

Собственно провел эксперемент Улыбаюсь Вот его результаты
Код:

mysql> show tables;
+----------------+
| Tables_in_prob |
+----------------+
| author         |
| svod           |
+----------------+
2 rows in set (0.00 sec)

mysql> desc author;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| par1  | int(11)     | YES  |     | NULL    |       |
| par2  | int(11)     | YES  |     | NULL    |       |
| parn  | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> desc svod;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| type  | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from author;
+------+------+------+------+------+
| id   | name | par1 | par2 | parn |
+------+------+------+------+------+
|    1 | ser  |    1 |    3 |    5 |
|    2 | art  |    2 |    4 |    6 |
|    3 | res  |    1 |    3 |    6 |
|    4 | tres |    2 |    4 |    5 |
+------+------+------+------+------+
4 rows in set (0.00 sec)

mysql> select * from svod;
+------+--------+------+
| id   | name   | type |
+------+--------+------+
|    1 | Sanc   |    1 |
|    2 | Mosc   |    1 |
|    3 | Fant   |    2 |
|    4 | Detect |    2 |
|    5 | dev    |    3 |
|    6 | den    |    3 |
+------+--------+------+
6 rows in set (0.00 sec)

mysql> select Z.id as ID, Z.name as Name, Z.type as Type, count(1) as Count
    -> from author as A,  (select id,name,type from svod where type = 1) as Z
    -> where Z.id = A.par1
    -> Group by Z.id;
+------+------+------+-------+
| ID   | Name | Type | Count |
+------+------+------+-------+
|    1 | Sanc |    1 |     2 |
|    2 | Mosc |    1 |     2 |
+------+------+------+-------+
2 rows in set (0.01 sec)
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Alisandres
Гость
« Ответ #12 : 21-07-2010 04:55 » 

Dimka, не напрягают, не совсем понимаю как оно работает...

Версия MSSQL 2005 и /или mysql 5
Показываю реальные данные одной из таких таблиц - таблица описания компьютеров:
Таблица config, в ней конфигурационные записи:
idnametype
1Asus P51
2Intel 3451
3Radeon x6002
4P4 3.0 Ghz3
52x512 Pc 32004
6Radeon x6502
7MSI K9N Ultra1
где полю type соответствует номер типа записи:
1 - материнские платы
2 - видеокарты
3 - процессоры
4 - ОЗУ

Таблица pc, в ней записи о компьютерах
idnumermotervideocpuozu
113121345
213137645
в котором согласно типу поля, например запись id2 и тип поля moter внесена запись из таблицы config под id 7

я сделал вычисление количества циклом при генерировании списка, хотелось бы сделать что бы эти данные считались запросом SQL.
« Последнее редактирование: 21-07-2010 05:19 от Alisandres » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 21-07-2010 08:57 » 

Alisandres, это новая разработка или доработка существующей программы?

Если новая, то разумнее будет перепроектировать базу данных. Если доработка существующей - писать запрос.

Перепроектирование: У тебя есть справочник config. У тебя где-то должен быть справочник type. Нужно ввести дополнительную сущность, например, pc_element, в которой записями формировать состав компьютеров. Это будет лучше, потому что комплектация компьютеров может быть разной, поэтому колонки в твоей таблице pc теоретически могут содержать NULL. Это будет лучше в том случае, когда у тебя появится новый тип оборудования - не нужно будет менять структуру таблиц.

type
iddescript
1Motherboard
2Video
3CPU
4RAM

config
idnametype
1Asus P51
2Intel 3451
3Radeon x6002
4P4 3.0 Ghz3
52x512 Pc 32004
6Radeon x6502
7MSI K9N Ultra1

pc
idnumber
11312
21313

pc_element
pcconfig
11
13
14
15
27
26
24
25

Запрос данных становится тривиальным.
« Последнее редактирование: 21-07-2010 09:00 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines