Вопрос № 126026: Уважаемые эксперты, подскажите, ка обьединить следующие два запроса в один, чтобы получить результаты одной строкой?
<b>
SELECT `invites` FROM `users` WHERE `id` = '1'
SELECT COUNT(*) FROM `invites` WHERE `inviter` = '1'
</b>
...
Вопрос № 126.026
Уважаемые эксперты, подскажите, ка обьединить следующие два запроса в один, чтобы получить результаты одной строкой?
SELECT `invites` FROM `users` WHERE `id` = '1'
SELECT COUNT(*) FROM `invites` WHERE `inviter` = '1'
select users.invites, count(invites.inviter)
from users
left join invites on invites.invinter=users.id
where id=:n
group by users.invites
--------- Программист - это человек который решает проблему, о которой вы не знаете, способом который вы не понимаете
Ответ отправил: Raptor3 (статус: 5-ый класс)
Ответ отправлен: 05.03.2008, 06:48 Оценка за ответ: 5 Комментарий оценки: Спасибо.
Отвечает: Евсюков Виталий Евгеньевич
Здравствуйте, Миленин Александр!
Вроде как еще можно было бы
SELECT users.invites, COUNT(invites.inviter) FROM users, invites WHERE (users.id = invites.inviter) AND (users.id = 1)
Поправьте, если ошибся
--------- I Aear can ven na Mar
Ответ отправил: Евсюков Виталий Евгеньевич (статус: 4-ый класс)
Ответ отправлен: 05.03.2008, 08:18 Оценка за ответ: 5 Комментарий оценки: Большое спасибо, использую именно этот варианю
Отвечает: Zubex
Здравствуйте, Миленин Александр!
Попробуйте следующий вариант:
SELECT `invites`, (SELECT COUNT(*) FROM `invites` WHERE `inviter` = '1') cnt FROM `users` WHERE `id` = '1'
Удачи!
--------- Если не знаешь что сказать - лучше промолчи...
Ответ отправил: Zubex (статус: 8-ой класс)
Ответ отправлен: 05.03.2008, 10:00 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: Силантьев А.В.
Здравствуйте, Миленин Александр!
Из-за того, что предметная область описана не полностью, возможны различные варианты трактовок.
По названию invites в таблице users можно сделать предположение о том, что это
поле содержит информацию о количестве приглашений, к которым пользователь имел отношение в качестве приглашающего (см. `inviter` = '1').
Если это так, то это свидетельствует о де нормализованной форме структуры таблиц базы данных.
К такой де нормализации прибегают для того, чтобы повысить производительность системы, в случае частых обращений к информации о количестве участий в приглашениях.
Тогда необходимость объединения двух запросов в один можно объяснить желанием проверить соответствие значений поля invites таблицы users, реальному количеству записей в таблице invites, где пользователь выступает в качестве приглашающего
(см. WHERE `id` = '1' и WHERE `inviter` = '1')
В этом случае мы получим строку с результатом
(
пользователь,
количество приглашений из таблицы users,
количество приглашений из таблицы invites
).
select
u.id user_id
,u.invites invites_in_users
,count(i.inviter) invites_in_invites
from users u left join invites i
on (u.id=i.inviter)
group by u.id,u.invites
having count(i.inviter)!=u.invites
Такая необходимость может возникнуть при поиске случаев несогласованности в данных.
Можно предложить еще вариант, который позволяет определить случаи (если существование таких допускает структура базы данных), когда в таблице invites есть ссылки на "пользователей - приглашающих", отсутствующих в таблице users:
select
u.id user_id
,u.invites invites_in_users
,count(i.inviter) invites_in_invites
from users u left join invites i
on (u.id=i.inviter)
group by u.id,u.invites
having count(i.inviter)!=u.invites
union all
select
i.inviter user_id
,sum(NULL) invites_in_users
,count(*) invites_in_invites
from invites i
where not exists(select null from users u where u.id=i.inviter)
group by i.inviter
Данный пример я привожу лишь с целью показать, какие ответы Вы можете получить, не давая полного описания постановки задачи.
Вам могут предложить ответ, полностью Вас не устраивающий.
Еще пример.
По названию invites в таблице users можно сделать предположение о том, что это идентификатор приглашения в таблице invites.
Если это так, то такая форма ненормализованности скорее свидетельствует об ошибке проектирования структуры БД.
Можно и дальше продолжить фантазировать...
Raptor3 -
подсчитать количество записей в таблице invites для каждого типа «invites» пользователя c id=1, когда пользователь выступает в качестве приглашающего или выдать 0 для этого типа, если пользователь с таким invites никогда
никого не приглашал.
Евсюков -
подсчитать количество записей в таблице invites для каждого типа «invites» пользователя c id=1, когда пользователь выступает в качестве приглашающего.
(только этот запрос содержит ошибку)
ВСЕ РАБОТЫ ХОРОШИ, ВЫБИРАЙ НА ВКУС.
Ответ отправил: Силантьев А.В. (статус: 2-ой класс)
Ответ отправлен: 05.03.2008, 11:02 Оценка за ответ: 5 Комментарий оценки: Большое спасибо за ответ с такими подробными пояснениями.