powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Изменить запрос к БД
10 сообщений из 10, страница 1 из 1
Изменить запрос к БД
    #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
Изменить запрос к БД
    #39157085
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-первых, если хотя бы по одному из видов(in/out) количество звонков будет более одного, то эти каунты выдадут чушь
во-вторых, всё то же самое можно спросить и про собрания

и только когда вы хотя бы с этим разберётесь, можно приступать к решению увлекательной задачи "приджойни таблицу 1, если в поле 1 лежит икс, и таблицу 2, если там игрек"
...
Рейтинг: 0 / 0
Изменить запрос к БД
    #39165380
pticaognennaya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно запрос выдает не то надо. Подскажите, как в одном запросе посчитать одинаковые значения нескольких полей?
...
Рейтинг: 0 / 0
Изменить запрос к БД
    #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
Изменить запрос к БД
    #39165445
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pticaognennayaЕс

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


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

count( distinct case... end )
...
Рейтинг: 0 / 0
Изменить запрос к БД
    #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
Изменить запрос к БД
    #39172592
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pticaognennaya,

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

Тогда нельзя Join делать...
...
Рейтинг: 0 / 0
Изменить запрос к БД
    #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
Изменить запрос к БД
    #39173210
pticaognennaya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pticaognennaya,

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


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