Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Изменить запрос к БД / 10 сообщений из 10, страница 1 из 1
27.01.2016, 13:50:37
    #39156525
pticaognennaya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
Есть такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
SELECT
    `realty`.`realty_id`,
    `realty`.`name`,
    `realty`.`square`,
    COUNT(co.`direction`) OB, /*исх*/
    COUNT(ci.`direction`) IB, /*вход*/
    COUNT(me.`status`) HE,
    COUNT(ml.`status`) PL,
    COUNT(mh.`status`) NH
 
FROM
    `realty`
LEFT JOIN
    `calls` co
ON
    `realty`.`id` = co.`realty_id`
    AND co.`direction` = 'Outbound' /*исх*/
    AND co.`deleted` = 0
 
LEFT JOIN
    `calls` ci
ON
    `realty`.`id` = ci.`realty_id`
    AND ci.`direction` = 'Inbound' /*вход*/
    AND ci.`deleted` = 0
 
LEFT JOIN
    `meetings` me
ON
    `realty`.`id` = me.`realty_id`
    AND me.`status` = 'Held'
    AND me.`deleted` = 0
 
LEFT JOIN
    `meetings` ml
ON
    `realty`.`id` = ml.`realty_id`
    AND ml.`status` = 'Planned'
    AND ml.`deleted` = 0
 
LEFT JOIN
    `meetings` mh
ON
    `realty`.`id` = mh.`realty_id`
    AND mh.`status` = 'Not Held'
    AND mh.`deleted` = 0
 
WHERE
    `building_id` = '".$buildings->id."'
    AND
    `realty`.`deleted` = 0
GROUP BY `realty`.`realty_id`;


Таблица meetings имеет поле parent_id и поле parent_type. parent_type - определяет какой таблице соответствует запись из meetings и принимает два значения Accounts (таблица Accounts) и Contacts (таблица Contacts), а parent_id - совпадает в одной или другой таблице. В таблицах Accounts и Contacts поля id соответствуют parent_id в meetings

Нужно получить помимо status из meetings (уже реализовано), значение поля name из Accounts и значения полей first_name и last_name из Contacts
...
Рейтинг: 0 / 0
28.01.2016, 06:18:36
    #39157085
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
во-первых, если хотя бы по одному из видов(in/out) количество звонков будет более одного, то эти каунты выдадут чушь
во-вторых, всё то же самое можно спросить и про собрания

и только когда вы хотя бы с этим разберётесь, можно приступать к решению увлекательной задачи "приджойни таблицу 1, если в поле 1 лежит икс, и таблицу 2, если там игрек"
...
Рейтинг: 0 / 0
08.02.2016, 11:41:30
    #39165380
pticaognennaya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
Действительно запрос выдает не то надо. Подскажите, как в одном запросе посчитать одинаковые значения нескольких полей?
...
Рейтинг: 0 / 0
08.02.2016, 12:31:39
    #39165439
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
pticaognennayaТаблица meetings имеет поле parent_id и поле parent_type. parent_type - определяет какой таблице соответствует запись из meetings и принимает два значения Accounts (таблица Accounts) и Contacts (таблица Contacts), а parent_id - совпадает в одной или другой таблице. В таблицах Accounts и Contacts поля id соответствуют parent_id в meetings


блин, че за стыд...
...
Рейтинг: 0 / 0
08.02.2016, 12:33:06
    #39165445
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
pticaognennayaЕс

Нужно получить помимо status из meetings (уже реализовано), значение поля name из Accounts и значения полей first_name и last_name из Contacts


два left join на обе родительских таблицы и coalesce в выражениях списка вывода.
...
Рейтинг: 0 / 0
08.02.2016, 12:35:45
    #39165449
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
pticaognennayaДействительно запрос выдает не то надо. Подскажите, как в одном запросе посчитать одинаковые значения нескольких полей?

count( distinct case... end )
...
Рейтинг: 0 / 0
16.02.2016, 15:17:50
    #39172357
pticaognennaya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
Вот так отображает вроде то что надо.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT
	realty.id,
    count(case when meetings.status = 'Held'  then meetings.status end) as held,
    count(case when meetings.status = 'Not Held'  then meetings.status end) as notHeld,
    count(case when meetings.status = 'Planned'  then meetings.status end) as planned
FROM
 	realty
INNER JOIN
	meetings ON meetings.realty_id = realty.id
INNER JOIN
	buildings ON buildings.id =realty.building_id
WHERE
	meetings.deleted <> 1
    AND
    buildings.id = 'ad2010fc-cd64-45e2-1efb-56540a4811ac'
GROUP BY realty.id



Джойним еще одну таблицу и уже другие результаты

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT
    realty.id,
    count(case when calls.direction = 'Outbound'  then calls.direction end) as outbound,
    count(case when calls.direction = 'Inbound'  then calls.direction end) as inbound,
    count(case when meetings.status = 'Held'  then meetings.status end) as held,
    count(case when meetings.status = 'Not Held'  then meetings.status end) as notHeld,
    count(case when meetings.status = 'Planned'  then meetings.status end) as planned
FROM
 	realty
INNER JOIN
	calls ON calls.realty_id = realty.id
INNER JOIN
	meetings ON meetings.realty_id = realty.id
INNER JOIN
	buildings ON buildings.id =realty.building_id
WHERE
	meetings.deleted <> 1
    AND
    buildings.id = 'ad2010fc-cd64-45e2-1efb-56540a4811ac'
GROUP BY realty.id



Что не так?
...
Рейтинг: 0 / 0
16.02.2016, 19:54:02
    #39172592
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
pticaognennaya,

reality:calls как относятся?
как 1:N ?

Тогда нельзя Join делать...
...
Рейтинг: 0 / 0
17.02.2016, 09:02:16
    #39172827
pticaognennaya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
MasterZiv,

Да, у одного realty может быть несколько calls

Вот так работает (как вы и показывали вначале). Добавился только distinct. (meetings <>1 перенес в подключение таблицы) Добавить добавил, а суть операции недопонимаю...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT
    realty.id, realty.realty_id, realty.square,
    COUNT(distinct CASE WHEN calls.direction = 'Outbound'  THEN calls.id END) AS outbound,
    COUNT(distinct CASE WHEN calls.direction = 'Inbound'  THEN calls.id END) AS inbound,
    COUNT(distinct CASE WHEN meetings.STATUS = 'Held'  THEN meetings.id END) AS held,
    COUNT(distinct CASE WHEN meetings.STATUS = 'Not Held'  THEN meetings.id END) AS notHeld,
    COUNT(distinct CASE WHEN meetings.STATUS = 'Planned'  THEN  meetings.id  END) AS planned
FROM
    realty
LEFT OUTER JOIN
    buildings ON buildings.id = realty.building_id
LEFT OUTER JOIN
    calls ON calls.realty_id = realty.id
LEFT OUTER JOIN
    meetings ON meetings.realty_id = realty.id
	AND
	meetings.deleted <> 1
WHERE
    buildings.id = 'ad2010fc-cd64-45e2-1efb-56540a4811ac'
GROUP BY realty.id
...
Рейтинг: 0 / 0
17.02.2016, 14:37:54
    #39173210
pticaognennaya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить запрос к БД
pticaognennaya,

distinct по id
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Изменить запрос к БД / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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