SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 23.01.2011 15:50:21

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Вложенные запросы

Уважаемые коллеги, есть необходимость реализации следующей задачи.
Существует БД , состоящая из нескольких однотипных таблиц (`tb_183`,`tb_214`,`tb_126`), хранящих однотипную информацию по браку , каждая таблица под отдельную номенклатуру деталей.

Пример таблицы

CREATE TABLE `tb_183`(
`id` int(10) unsigned   auto_increment,
`Data` date,
`Kokil` tinyint(2) unsigned NOT NULL,
`Defect` smallint(3) unsigned NOT NULL,
`Mesto` varchar(5) character set cp1251 NOT NULL,
`Avtor` varchar(3) character set cp1251 default ' ',
`Stergen` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Data`,`Kokil`,`Defect`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


Для анализа хранящейся информации, за определённый период времени ( сутки ) и последующей работы необходимо по каждой номенклатуре ( таблице)  произвести группировку по количеству дефектов ( например так
select 183 gb, Defect, count( Defect) as Kolichestvo from tb_183 where Data ='20110123' group by Defect having Kolichestvo >2
order by Kolichestvo desc;
  ), далее рассмотреть как сгрупированы по количеству Kokil , т.е. сколько раз встречается каждый Kokil для каждой группы дефектов  встречающейся более 2 раз ( например так
select 183 gb,756 Slom, Kokil, count(Kokil) as Kolichestvo from tb_183 where Defect='756' and Data ='20110123'
 group by Kokil
order by Kolichestvo desc;
), далее наиболее часто встречающиеся Kokil ( например более 2 раз ) рассмотреть по всем остальным столбцам таблицы Mesto,Avtor,Stergen.

Всё это можно произвести вручную, каждый раз меняя в запросе дату , вид дефекта ( в зависимости от частоты повторений ), номер Kokil и т.д. , но хотелось бы это всё реализовать при помощи вложенного запроса или может быть как то по другому ??? ( чтобы не производить подобных манипуляций (вручную, каждый раз меняя в запросе дату , вид дефекта,номер Kokil ).
Подскажите как , ни когда не работал с вложенными запросами ???

Неактивен

 

#2 23.01.2011 23:38:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вложенные запросы

Подзапросы — это очень просто smile Просто пишите так, как если бы
писали на естественном языке:

SELECT 183 gb, Defect, Kokil, COUNT(Kokil)
FROM tb_183
WHERE Defect IN (SELECT Defect FROM tb_183 WHERE Data = '...' GROUP BY 1 HAVING COUNT(*) > 2)
AND Data = '...'
GROUP BY ... ORDER BY ...;

А одиночные дефекты Вас почему-то не интересуют?

Неактивен

 

#3 15.03.2011 22:14:18

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Вложенные запросы

Прошло время и появилась необходимость вернуться к незаконченным делам...
Исходные данные не изменились ( см. посты выше).

Имеем  запрос вида... и получаем результат

mysql> select 183 gb,756 Slom, Kokil, count(Kokil) as Kolichestvo from tb_183 where Defect='756' and Data ='20110315'
    ->  group by Kokil
    -> order by Kolichestvo desc;
+-----+------+-------+-------------+
| gb  | Slom | Kokil | Kolichestvo |
+-----+------+-------+-------------+
| 183 |  756 |    29 |           4 |
| 183 |  756 |    69 |           2 |
| 183 |  756 |    81 |           2 |
+-----+------+-------+-------------+
3 rows in set (0.00 sec)


Теперь хотелось бы написать запрос , например select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil = '29' что бы он по порядку вывел информацию по каждой строке из вышеприведённого результата запроса.
Подскажите как сиё реализовать ???

Отредактированно Twix (16.03.2011 18:50:03)

Неактивен

 

#4 17.03.2011 00:43:29

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вложенные запросы

Трижды перечитал, но не понял, что нужно получить. Добавить еще полей из
tb_183? Добавьте. Или я что-то не понимаю совсем sad

Неактивен

 

#5 17.03.2011 18:06:22

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Вложенные запросы

Нужно выполнить три запроса

select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil = '29'

select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil = '69'

select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil = '81'

Сегодня помозговал и как вариант возникло следующее решение :
сохраняем данные запроса select 183 gb,756 Slom, Kokil, count(Kokil) as Kolichestvo from tb_183 where Defect='756' and Data ='20110315'
    ->  group by Kokil
    -> order by Kolichestvo desc;
в файл, далее создаём таблицу , с полем id и заносим данные из файла в эту таблицу .
Далее выполняем несколько запросов вида select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and id= 1;
select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and id= 2;
...
...
select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and id= 10;

Решение не слишком оригинальное, но всё же решение...

Неактивен

 

#6 17.03.2011 21:42:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вложенные запросы

select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil IN (29, 69, 81).
Или даже подзапросом:
select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil IN (SELECT Kokil FROM ...);

Неактивен

 

#7 17.03.2011 22:02:50

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Вложенные запросы

paulus написал:

select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil IN (29, 69, 81).
Или даже подзапросом:
select  Mesto,Avtor,Stergen from tb_183 where Defect='756' and Data ='20110315' and Kokil IN (SELECT Kokil FROM ...);

Сложность в том, что вместо 29,69,81 можгут быть другие значения ( это так для примера) по этому первый вариант не подойдёт, да и второй наверное тоже.???

Неактивен

 

#8 17.03.2011 22:09:22

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Вложенные запросы

Суть вопроса в следующем.
Имеем результаты запроса в виде
+-----+------+-------+-------------+
| gb  | Slom | Kokil | Kolichestvo |
+-----+------+-------+-------------+
| 183 |  756 |    29 |           4 |
| 183 |  756 |    69 |           2 |
| 183 |  756 |    81 |           2 |
+-----+------+-------+-------------+

которые показывают - какое количество какого кокиля было по данному дефекту. И следующаяя задача произвести запрос информации по каждому кокилю, количество которого например более 1.

Неактивен

 

#9 18.03.2011 03:45:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вложенные запросы

Отлично, делаете по варианту номер два — вставляете этот подзапрос в скобки smile
Только в списке полей укажите одно поле Kokil, а не четыре, — и всё будет работать.

Неактивен

 

#10 18.03.2011 18:41:23

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Вложенные запросы

Всё , спасибо за помощь. Пока вопросы отпали.

Отредактированно Twix (18.03.2011 19:56:24)

Неактивен

 

Board footer

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