Несколько полезных SQL запросов

Технические вопросы по UTM 5.0
Закрыто
starchik
Сообщения: 461
Зарегистрирован: Сб ноя 22, 2008 22:07

Сообщение starchik »

что значит как? вам нужен сам запрос или алгоритм?

смотрим какой тариф у пользователя, и из таблицы выдираем кост для этого тарифа.

Код: Выделить всё

SELECT u.id, u.login, u.basic_account, a.balance, psd.cost, u.full_name 
FROM accounts a, users u, service_links sl, account_tariff_link atl, tariffs t, periodic_services_data psd, tariffs_services_link tsl 
WHERE a.id = u.basic_account 
  AND a.is_deleted = '0' 
  AND sl.account_id = u.basic_account 
  AND sl.is_deleted = '0' 
  AND atl.id = sl.tariff_link_id 
  AND atl.is_deleted = '0' 
  AND atl.tariff_id = t.id 
  AND tsl.tariff_id = atl.tariff_id 
  AND psd.id = tsl.service_id 
  AND psd.is_deleted = '0' 
ORDER BY a.id;
это немного больше чем требуется Вам, но при желании из большего всегда можно сделать меньше.......

Jonson
Сообщения: 150
Зарегистрирован: Ср фев 02, 2005 21:48
Откуда: МО, Ногинский р-он

Сообщение Jonson »

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

Jonson
Сообщения: 150
Зарегистрирован: Ср фев 02, 2005 21:48
Откуда: МО, Ногинский р-он

Сообщение Jonson »

starchik писал(а):что значит как? вам нужен сам запрос или алгоритм?

смотрим какой тариф у пользователя, и из таблицы выдираем кост для этого тарифа.

Код: Выделить всё

SELECT u.id, u.login, u.basic_account, a.balance, psd.cost, u.full_name 
FROM accounts a, users u, service_links sl, account_tariff_link atl, tariffs t, periodic_services_data psd, tariffs_services_link tsl 
WHERE a.id = u.basic_account 
  AND a.is_deleted = '0' 
  AND sl.account_id = u.basic_account 
  AND sl.is_deleted = '0' 
  AND atl.id = sl.tariff_link_id 
  AND atl.is_deleted = '0' 
  AND atl.tariff_id = t.id 
  AND tsl.tariff_id = atl.tariff_id 
  AND psd.id = tsl.service_id 
  AND psd.is_deleted = '0' 
ORDER BY a.id;
это немного больше чем требуется Вам, но при желании из большего всегда можно сделать меньше.......
необходимый запрос сделал, но попробовал сделать еще запрос с условиями: услуга находится в диапазоне и группа не равна 126
в чем у меня ошибка?

Код: Выделить всё

FROM users_groups_link ugl, accounts a, users u, service_links sl, account_tariff_link atl, tariffs t, periodic_services_data psd, tariffs_services_link tsl 
WHERE a.id = u.basic_account 
  AND a.is_deleted = '0' 
  AND sl.account_id = u.basic_account 
  AND sl.is_deleted = '0' 
  AND atl.id = sl.tariff_link_id 
  AND atl.is_deleted = '0' 
  AND atl.tariff_id = t.id 
  AND tsl.tariff_id = atl.tariff_id 
  AND psd.id = tsl.service_id
  AND psd.is_deleted = '0'
  AND &#40;psd.id>94 and psd.id<105&#41;
  AND ugl.user_id = u.id
  AND ugl.group_id<>126;

starchik
Сообщения: 461
Зарегистрирован: Сб ноя 22, 2008 22:07

Сообщение starchik »

странный запрос......кто-то тут уже писал такое повторюсь, Ну и запросы у вас, сказала база данных и повисла :)

а где у вас SELECT?

буду дома посмотрю....

Jonson
Сообщения: 150
Зарегистрирован: Ср фев 02, 2005 21:48
Откуда: МО, Ногинский р-он

Сообщение Jonson »

это я копируя запрос пропустил select u.id

starchik
Сообщения: 461
Зарегистрирован: Сб ноя 22, 2008 22:07

Сообщение starchik »

Код: Выделить всё

AND &#40;psd.id>94 and psd.id<105&#41;
это строка должны выглядеть так

Код: Выделить всё

AND psd.id>94 OR psd.id<105

Jonson
Сообщения: 150
Зарегистрирован: Ср фев 02, 2005 21:48
Откуда: МО, Ногинский р-он

Сообщение Jonson »

starchik писал(а):

Код: Выделить всё

AND &#40;psd.id>94 and psd.id<105&#41;
это строка должны выглядеть так

Код: Выделить всё

AND psd.id>94 OR psd.id<105
так не работает.

вот рабочий момент выбора диапазона

Код: Выделить всё

SELECT u.id 
FROM accounts a, users u, service_links sl, account_tariff_link atl, tariffs t, periodic_services_data psd, tariffs_services_link tsl 
WHERE a.id = u.basic_account 
  AND a.is_deleted = '0' 
  AND sl.account_id = u.basic_account 
  AND sl.is_deleted = '0' 
  AND atl.id = sl.tariff_link_id 
  AND atl.is_deleted = '0' 
  AND atl.tariff_id = t.id 
  AND tsl.tariff_id = atl.tariff_id 
  AND psd.id = tsl.service_id 
  AND psd.is_deleted = '0' 
  AND psd.id>94 and psd.id<105;
но этот запрос с выбором группы выдает дубликаты

Код: Выделить всё

SELECT u.id
FROM users_groups_link ugl, accounts a, users u, service_links sl, account_tariff_link atl, tariffs t, periodic_services_data psd, tariffs_services_link tsl 
WHERE a.id = u.basic_account 
  AND a.is_deleted = '0' 
  AND sl.account_id = u.basic_account 
  AND sl.is_deleted = '0' 
  AND atl.id = sl.tariff_link_id 
  AND atl.is_deleted = '0' 
  AND atl.tariff_id = t.id 
  AND tsl.tariff_id = atl.tariff_id 
  AND psd.id = tsl.service_id
  AND psd.is_deleted = '0'
  AND psd.id>94 AND psd.id<105
  AND ugl.user_id = u.id
  AND ugl.group_id<>126;

Код: Выделить всё

| id  |
+-----+
|   1 |
|   1 |
| 231 |
| 231 |
как решить эту проблему?

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

group by

Jonson
Сообщения: 150
Зарегистрирован: Ср фев 02, 2005 21:48
Откуда: МО, Ногинский р-он

Сообщение Jonson »

Pulse писал(а):group by
спасибо, но обратил внимание на проблему, если есть и другие группы, кроме 126, то id все равно попадает в выборку, как этого избежать?

solomon
Сообщения: 316
Зарегистрирован: Вт мар 16, 2010 08:39

Сообщение solomon »

Возникла нужда узнать сколько пользователей имеют тариф анлимитчиков может кому пригодится

Код: Выделить всё

select u.login, t.name, atl.account_id, atl.tariff_id , atl.is_deleted from account_tariff_link AS atl, tariffs AS t, users AS u where atl.account_id=u.basic_account AND atl.tariff_id=t.id AND atl.is_deleted=0 and t.name LIKE '%nlim%';

SAN
Сообщения: 32
Зарегистрирован: Сб июл 09, 2005 08:47

Параметры ип и периодических услуг

Сообщение SAN »

Параметры ип и периодических услуг

Код: Выделить всё

SELECT tariffs.name,
    services_data.service_name,
    services_data.comment,
    periodic_services_data.cost,
    periodic_services_data.discount_method,
    iptraffic_borders.border/1048576,
    iptraffic_borders.cost
FROM services_data
INNER JOIN periodic_services_data
    ON periodic_services_data.id = services_data.id
INNER JOIN iptraffic_services_data
    ON iptraffic_services_data.id = services_data.id
INNER JOIN tariffs_services_link
    ON tariffs_services_link.service_id = services_data.id
INNER JOIN tariffs
    ON tariffs_services_link.tariff_id = tariffs.id
LEFT OUTER JOIN traf_serv_tclasses
    ON traf_serv_tclasses.tst_id = iptraffic_services_data.tst_id
LEFT OUTER JOIN  iptraffic_borders
    ON iptraffic_borders.borders_id = traf_serv_tclasses.borders_id
WHERE services_data.is_deleted = 0;

SAN
Сообщения: 32
Зарегистрирован: Сб июл 09, 2005 08:47

Сообщение SAN »

Выборка Наименования пользователя, логина, IP и Наименования тарифа этого пользователя

Код: Выделить всё

SELECT u.full_name,
 ig.uname,
 INET_NTOA&#40;ig.ip&#41;,
 sd.service_name
FROM users AS u,
 service_links AS sl,
 iptraffic_service_links AS isl,
 ip_groups AS ig,
 services_data AS sd
WHERE u.id=sl.user_id
 AND isl.id=sl.id
 AND isl.ip_group_id=ig.ip_group_id
 AND sd.id=sl.service_id
 AND ig.is_deleted=0
 AND sl.is_deleted=0;

reboot
Сообщения: 1
Зарегистрирован: Ср авг 10, 2011 01:53

Сообщение reboot »

Вот искал я запрос, который бы смог мне построить выписку по всем изменениям абонентского счёта конкретного абонента за указанный период. Не нашёл, написал сам и решил поделиться.

Код: Выделить всё

/* Задаём параметры выборки, а именно период и логин абонента */
set @login="login";
set @start_date = UNIX_TIMESTAMP&#40; '2010-09-01 00&#58;00&#58;00' &#41;;
set @end_date = UNIX_TIMESTAMP&#40; '2011-05-01 00&#58;00&#58;00' &#41;;

/* Отдельно по логину извлекаем ID аккаунта */
set @account = &#40; select users.basic_account from users where users.login like @login &#41;;

/* Основная выборка данных */
select 
	FROM_UNIXTIME&#40; discount_date &#41; as "Дата операции", 
	if&#40; services_data.service_name is null, "Платёж", "Снятие" &#41; "Операция",
	if&#40; services_data.service_name is null, "", services_data.service_name &#41; "Основание",
	ROUND&#40; incoming_rest , 2 &#41; as "Счёт до операции",
	ROUND&#40; &#40; -1*discount &#41; , 2 &#41; as "Сумма операции",
	ROUND&#40; outgoing_rest , 2 &#41; as "Счёт после операции"
/* Используем таблицу денежных списаний &#40;где почему то есть так же и начисления&#41; */
from 
	discount_transactions_all

/* Подключаем сервисные связки что бы узнать за что списаны деньги */
left join  services_data on services_data.id=discount_transactions_all.service_id

where
	account_id=@account
and
	/* Наткнулся на невероятное множество микросписаний, пришлось откидывать */
	ROUND&#40; discount , 2 &#41; <> 0
and
	discount_date > @start_date
and
	discount_date < @end_date

order by "Дата операции"
По вкусу так же можно прикручивать расчётные периоды и прочее. К сожалению такая выборка не позволяет узнать метод платежа. Их можно прикручивать отдельно, но это сильно усложнит структуру запроса, да и время запроса тоже сильно пострадает.

Cramac
Сообщения: 454
Зарегистрирован: Сб июл 01, 2006 17:59

Сообщение Cramac »

Подскажите с запросом на поиск абонентов онлайн?

Сейчас использую такой запрос:
SELECT id FROM dhs_sessions_log where Framed_IP_Address>0 and last_update_date>".$starttime." and User_Name='".$u_login
но не всегда срабатывает.

Jonson
Сообщения: 150
Зарегистрирован: Ср фев 02, 2005 21:48
Откуда: МО, Ногинский р-он

Сообщение Jonson »

где храниться пароль на инет?

Закрыто