Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите составить двухтабличный запрос: список запрещенных провайдеров
 
 автор: dimaxz   (15.11.2011 в 22:00)   письмо автору
 
 

Добрый день нужна помощь в составлении запроса,есть две таблицы:

providers:
id | provider_name | group_id
1 | test | 3
2 | spec | 1
3 | other | 3
4 | test2 | 2

provider_grands:
id | group_mask | provider | grant_type
1 | % | % | ALLOW
2 | 3 | % | DENY
3 | % | 2 | DENY

цель получить список providers каторые запрещены в таблице provider_grands по group_mask и provider где grant_type=DENY

  Ответить  
 
 автор: dimaxz   (15.11.2011 в 22:07)   письмо автору
 
   для: dimaxz   (15.11.2011 в 22:00)
 

т.е. при выборке из providers должна остаться одна запись 4 | test2 | 2

  Ответить  
 
 автор: cheops   (15.11.2011 в 22:14)   письмо автору
 
   для: dimaxz   (15.11.2011 в 22:07)
 

Хм... так нужны запрещенные или разрешенные провайдеры?

  Ответить  
 
 автор: dimaxz   (15.11.2011 в 22:18)   письмо автору
 
   для: dimaxz   (15.11.2011 в 22:07)
 

запрос:
SELECT providers.id
     , providers.name
     , providers.group_id
FROM
  providers
INNER JOIN provider_grands pg1
ON providers.group_id LIKE pg1.group_mask AND pg1.grant_type = "DENY"
INNER JOIN provider_grands pg2
ON providers.id LIKE pg2.provider AND pg2.grant_type = "DENY"
GROUP BY
  providers.id
, providers.name
, providers.group_id


Дампы таблиц:
CREATE TABLE provider_grands(
  id INT(11) NOT NULL AUTO_INCREMENT,
  group_mask VARCHAR(255) DEFAULT NULL,
  provider VARCHAR(255) DEFAULT NULL,
  grant_type ENUM('DENY', 'ALLOW') DEFAULT 'ALLOW',
  PRIMARY KEY (id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 4
AVG_ROW_LENGTH = 20
CHARACTER SET utf8
COLLATE utf8_general_ci;


CREATE TABLE providers(
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) DEFAULT NULL,
  group_id INT(11) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 5
AVG_ROW_LENGTH = 20
CHARACTER SET utf8
COLLATE utf8_general_ci;


Данные:


INSERT INTO provider_grands VALUES 
  (1, '%', '%', 'ALLOW'),
  (2, '3', '%', 'DENY'),
  (3, '%', '2', 'DENY');

INSERT INTO providers VALUES 
  (1, 'test', 3),
  (2, 'spec', 1),
  (3, 'other', 3),
  (4, 'test2', 2);

  Ответить  
 
 автор: cheops   (15.11.2011 в 22:13)   письмо автору
 
   для: dimaxz   (15.11.2011 в 22:00)
 

Список запрещенных провайдеров можно получить следующим образом
SELECT * FROM providers
WHERE
  group_id IN
    (SELECT
       group_mask
     FROM
       provider_grands
     WHERE
       grant_type = 'DENY' AND
       group_mask <> '%')
OR
  id IN
    (SELECT
       provider
     FROM
       provider_grands
     WHERE
       grant_type = 'DENY' AND
       provider <> '%')

  Ответить  
 
 автор: dimaxz   (15.11.2011 в 22:20)   письмо автору
 
   для: cheops   (15.11.2011 в 22:13)
 

Круто! Оперативно! Спасибо! Запрещенные, эти:
1 | test | 3
2 | spec | 1
3 | other | 3

немного подправил


SELECT *
FROM
  providers
WHERE
  providers.group_id IN (SELECT provider_grands.group_mask
                         FROM
                           provider_grands
                         WHERE
                           provider_grands.grant_type = 'DENY'
                           AND providers.group_id LIKE provider_grands.group_mask)
  OR providers.id IN (SELECT provider_grands.provider
                      FROM
                        provider_grands
                      WHERE
                        provider_grands.grant_type = 'DENY'
                        AND provider_grands.id LIKE provider_grands.provider)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования