Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

подсчет данных из разных таблиц

44K
07 июня 2009 года
sergik15828
17 / / 24.05.2009
Народ, подскажите пожалуйста, как сделать подсчет строк с определенными условиями из разных таблиц ОДНИМ ЗАПРОСОМ, например:
как заменить следующие запросы, одним

SELECT COUNT(user) FROM table1 WHERE user = '$user'
SELECT COUNT(user) FROM table2 WHERE user = '$user'
SELECT COUNT(user) FROM table3 WHERE user = '$user'
.................................
SELECT COUNT(user) FROM table50 WHERE user = '$user'


Заранее благодарю!!!!!!!!
4.9K
07 июня 2009 года
efferson
57 / / 08.12.2005
Если Ваша СУБД поддерживает подзапросы, можете попробовать нечто в вроде этого:
SELECT ( SELECT count(*) FROM table1 WHERE user = '$user') + (SELECT count(*) FROM table2 WHERE user = '$user') + (SELECT count(*) FROM table3 WHERE user = '$user');
304
07 июня 2009 года
Fenyx
707 / / 26.01.2005
Какая то извращенная логика проекта, разтребуется подсчет агрегатом записей нескольких таблиц.
ЗЫ какая БД?
44K
07 июня 2009 года
sergik15828
17 / / 24.05.2009
Цитата: Fenyx
ЗЫ какая БД?



mySQL

304
07 июня 2009 года
Fenyx
707 / / 26.01.2005
SELECT * FROM
(SELECT COUNT(user) as count1 FROM table1 WHERE user = '$user') as q1
(SELECT COUNT(user) as count2 FROM table2 WHERE user = '$user') as q2
(SELECT COUNT(user) as count3 FROM table3 WHERE user = '$user') as q3
44K
07 июня 2009 года
sergik15828
17 / / 24.05.2009
нашел решение, работает, но не уверен какой вариант лучше

SELECT count(DISTINCT table1.user), count(DISTINCT table2.user) FROM `table1`, `table2` where table1.user = $user && table2.user = $user


или как то оптимизировать этот запрос, таблиц очень много
304
07 июня 2009 года
Fenyx
707 / / 26.01.2005
Цитата: sergik15828
нашел решение, работает, но не уверен какой вариант лучше

SELECT count(DISTINCT table1.user), count(DISTINCT table2.user) FROM `table1`, `table2` where table1.user = $user && table2.user = $user


или как то оптимизировать этот запрос, таблиц очень много


Что тут оптимизировать? попадется 2-3 таблицы хотя бы со стотысячными записями - и если запрос будут дергать постоянно, кранты. А разницы в плане выполнения запроса большой думаю нет или она не критична. Если нужно такое поле количество по юзверю - лучше создать изначально результирующую таблицу куда при любой вставке в другие таблицы, значение счетчика увеличивалось на 1 или вставлялась новая запись. В постгре с этим замечательно справляются триггеры, в мускуле эту логику нужно реализовывать средставми приложения

44K
09 июня 2009 года
sergik15828
17 / / 24.05.2009
Цитата: Fenyx
Что тут оптимизировать? попадется 2-3 таблицы хотя бы со стотысячными записями - и если запрос будут дергать постоянно, кранты. А разницы в плане выполнения запроса большой думаю нет или она не критична. Если нужно такое поле количество по юзверю - лучше создать изначально результирующую таблицу куда при любой вставке в другие таблицы, значение счетчика увеличивалось на 1 или вставлялась новая запись. В постгре с этим замечательно справляются триггеры, в мускуле эту логику нужно реализовывать средставми приложения



в некоторых таблицах действительно доходит до 100 тыс записей, поэтому и важно что бы запрос был максимально эффективным :)

304
09 июня 2009 года
Fenyx
707 / / 26.01.2005
Цитата: sergik15828
в некоторых таблицах действительно доходит до 100 тыс записей, поэтому и важно что бы запрос был максимально эффективным :)


Решение я подсказал, хочешь мучить запрос - хоть о бесконечности

44K
09 июня 2009 года
sergik15828
17 / / 24.05.2009
ок, спасибо огромное
12
10 июня 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: sergik15828
в некоторых таблицах действительно доходит до 100 тыс записей, поэтому и важно что бы запрос был максимально эффективным :)


Тогда стоит начать с переделки структуры БД.

44K
10 июня 2009 года
sergik15828
17 / / 24.05.2009
цель этого запроса узнать, по сколько записей пользователь оставил в каждой таблице (таблицы это определенные сервисы моего сайта)

А вообще нужно ли лепить все в один запрос.
Или все же количество запросов влияет на производительность?
12
10 июня 2009 года
alekciy
3.0K / / 13.12.2005
На производительность в первом приближении влияет использование индексов, а так же размер базы ну и часто использования запроса. Вложенные запросы это всегда не очень хорошо.

Если с таким запросом у тебя СУБД пашет, значит до критического состояния ситуация еще не дошла. Но любая БД со временем растет и в один далеко не прекрасный день может высниться, что все тико тормозит. Поэтому стоит создать тестовую базу размером в неколько раз большим, что сейчас есть и посмотреть, как себе поведет сервер.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог