Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 354
от 10.03.2008, 03:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 461, Экспертов: 51
В номере:Вопросов: 1, Ответов: 4

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 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'


Спасибо.
Отправлен: 05.03.2008, 03:29
Вопрос задал: Миленин Александр (статус: Студент)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Raptor3
Здравствуйте, Миленин Александр!

n=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
Комментарий оценки:
Большое спасибо за ответ с такими подробными пояснениями.


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.72.2 от 06.03.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное