SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 16.09.2010 10:46:18

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Помогите разобраться с запросом на выборку

Утро доброе!

Имеется 3 таблицы:

1) VMU_PRVS
-ID_PRVS
-PRVS_NAME

2) CASE_SERVICES
-ID_SERVICE
-ID_PRVS

3) REFUSES_OBJ
-ID_SERVICE

Нужно: составить запрос на выборку, результатом которой будет являться:
VMU_PRVS.PRVS_NAME, count(CASE_SERVICES.ID_SERVICE), count(REFUSES_OBJ.ID_SERVICE).

Совсем не могу разобраться, т.к. выполнить это нужно именно в одном запросе, а с  join'ами я в конец запутался (выводится одинаковые результаты подсчета для 2х столбцов).

Прошу вас помочь разобраться в этом запросе, сам уже 2й день ломаю голову sad

Неактивен

 

#2 16.09.2010 12:37:49

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

Re: Помогите разобраться с запросом на выборку

Используйте подзапросы?

Неактивен

 

#3 16.09.2010 13:02:38

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Re: Помогите разобраться с запросом на выборку

К сожалению этой техникой я не владею sad
Как это?

Неактивен

 

#4 16.09.2010 13:17:49

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

Re: Помогите разобраться с запросом на выборку

SELECT PRVS_NAME, (SELECT COUNT(*) FROM CASE_SERVICES c WHERE c.ID_PRVS = v.ID_PRVS) CASE_SERVICES, …
FROM VMU_PRVS v;

Неактивен

 

#5 16.09.2010 13:51:01

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Re: Помогите разобраться с запросом на выборку

Спасибо!
То есть так? :
SELECT v.PRVS_NAME, (SELECT COUNT(*) FROM CASE_SERVICES c
WHERE c.ID_PRVS = v.ID_PRVS) AS CASE_S, (SELECT COUNT(*) FROM REFUSES_OBJ r, CASE_SERVICES c WHERE r.ID_SERVICE=c.ID_SERVICE) AS REFUSES_O
FROM VMU_PRVS AS v;

Похоже, но к сожалению результат не тот...

Каждой записи vmu_prvs.prvs_name должно соответствовать количество записей, которые числятся за данным значением в таблице case_service, и количество записей, совпадающие с значением из refuses_obj...

для наглядности заполнил таблицы данными:

1)vmu_prvs
id_prvs|prvs_name
1        |      aaa
2        |      bbb
3        |      ccc

2)case_services
id_service|id_prvs
a            |   1
b            |   2
c            |   2
d            |   3
e            |   1
f             |   1

3)refuses_obj
id_service
a
c
f

Результатом выполнения указанного выше запроса  было:

prvs_name|case_s|refuses_o
aaa         |     3   |   3
bbb         |     2   |   3
ccc         |     1   |   3

А должно быть:

prvs_name|case_s|refuses_o
aaa         |     3   |   2
bbb         |     2   |   1
ccc         |     1   |   0

Неактивен

 

#6 17.09.2010 21:05:48

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

Re: Помогите разобраться с запросом на выборку

Считайте COUNT (DISTINCT id_service) во втором случае?

Неактивен

 

#7 20.09.2010 12:53:35

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Re: Помогите разобраться с запросом на выборку

SELECT v.PRVS_NAME, (SELECT COUNT(*) FROM CASE_SERVICES c
WHERE c.ID_PRVS = v.ID_PRVS) AS CASE_S,
(SELECT COUNT(DISTINCT r.id_service) FROM REFUSES_OBJ r,
CASE_SERVICES c WHERE r.ID_SERVICE=c.ID_SERVICE) AS REFUSES_O
FROM VMU_PRVS v;

Результат не изменился sad

Неактивен

 

#8 20.09.2010 18:44:00

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

Re: Помогите разобраться с запросом на выборку

Брр. Вы хотите, чтобы я забил данные, и написал запрос за Вас, да? А где же
тогда эффект обучения? sad

Код:

[celestia] root test > select prvs_name, count(id_service), count(r.id_service) from vmu_prvs join case_services using (id_prvs) left join refuses_obj r using (id_service) group by 1;
+-----------+-------------------+---------------------+
| prvs_name | count(id_service) | count(r.id_service) |
+-----------+-------------------+---------------------+
| aaa       |                 3 |                   2 |
| bbb       |                 2 |                   1 |
| ccc       |                 1 |                   0 |
+-----------+-------------------+---------------------+
3 rows in set (0.00 sec)

Неактивен

 

#9 21.09.2010 09:59:12

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Re: Помогите разобраться с запросом на выборку

Спасибо огромное!
Эффект обучения сохраняется, просто было не совсем понятно как реализовать подобный запрос.
А без Вашей помощи я бы неизвестно что натворил еще...меня уже понесло в "create view as" и подобные степи smile
Спасибо.

Неактивен

 

#10 24.09.2010 12:55:09

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Re: Помогите разобраться с запросом на выборку

Если можно, еще вопрос...
Помогите с таким запросом:

есть 3 таблицы
1)patient_data
id_patient|name
1 | Иванов
2 | Петров
3 | Сидоров

2)case_services
id_service|Date_begin
a | 1.01.1990
b | 2.02.1990
c | 3.02.1990
d | 3.03.1990
e | 4.03.1990
f | 5.03.1990

3)refuses_obj
id_service|id_patient|refuse_date
a            | 1          | 01.01.1990
c            | 2          | 04.02.1990
f             | 2          | 06.03.1990

Нужно выбрать Patient_data.Name, case_services.date, refuses_obj.date_R. С условием, что refuses_obj.date_R > 02.02.1990 и < 06.03.1990
Соответственно результат:
Name    |case_date   |ref_d
Петров |03.02.1990  |04.02.1990

Выполняю такой запрос:

select p.name, r.Refuse_date, c.date_begin
from refuses_obj r
inner join patient_data p on (p.id_patient=r.id_patient)
inner join case_services c on (c.id_service=r.id_service)
where r.refuse_date="01.09.2010"

В ответ все поля null.
Где ошибка, и как сделать такой запрос без Using, как в предыдущем случае?

Неактивен

 

#11 26.09.2010 19:41:10

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

Re: Помогите разобраться с запросом на выборку

where r.refuse_date="01.09.2010"

Таких дат у Вас нету. Вроде бы, в условии было BETWEEN?

Неактивен

 

#12 27.09.2010 09:16:09

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Re: Помогите разобраться с запросом на выборку

Да, забыл отписаться- покопался в документациях и исправил свою недароботку в использовании дат. Спасибо!

Только вот столкнулся с другой проблемой...в первом запросе...
При запуске его на другом сервере, на котором установлен старенький Firebird 1.5, появляется ошибка на отсутствие в синтаксе такого хорошего и полезного слова using sad

Как эксперт в этой области можете посоветовать что-то, но без обновления версии сервера БД?

Неактивен

 

#13 27.09.2010 10:38:58

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

Re: Помогите разобраться с запросом на выборку

1. Firebird ≠ MySQL. Если хотите переносимости, используйте только ANSI SQL.
2. FROM a JOIN b USING (field) эквивалентно FROM a JOIN b ON a.field = b.field.

Неактивен

 

#14 27.09.2010 18:23:02

corn1
Участник
Зарегистрирован: 16.09.2010
Сообщений: 8

Re: Помогите разобраться с запросом на выборку

Спасибо за справку. Теперь переношу запрос на firebird. Хотя в обновленной версии обещали изменения, и некоторые пользователи говорят, что в синтаксисе появился using...однако у меня все равно не получилось.

Но зато попрактикуюсь в join'ах smile

Отредактированно corn1 (27.09.2010 23:52:09)

Неактивен

 

Board footer

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