|
|
|
| Добрый день нужна помощь в составлении запроса,есть две таблицы:
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:00)
| | т.е. при выборке из providers должна остаться одна запись 4 | test2 | 2 | |
|
|
|
|
|
|
|
для: dimaxz
(15.11.2011 в 22:07)
| | Хм... так нужны запрещенные или разрешенные провайдеры? | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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 <> '%')
|
| |
|
|
|
|
|
|
|
для: 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)
|
| |
|
|
|