Tenho a seguinte estrutura de tabelas (DDL):
CREATE TABLE restricted_components
(
component_id INT(11) PRIMARY KEY NOT NULL,
resources_id INT(11) NOT NULL,
component_dom_id VARCHAR(50) NOT NULL,
component_dom_class VARCHAR(50),
component_dom_data_name VARCHAR(50),
visible TINYINT(1) DEFAULT '0' NOT NULL
);
CREATE TABLE resources
(
resources_id INT(10) unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT,
resources_name VARCHAR(64) NOT NULL,
menu_href VARCHAR(128),
menu_text VARCHAR(64) NOT NULL
);
CREATE TABLE acl_groups_to_resources
(
groups_id INT(10) unsigned NOT NULL,
resources_id INT(10) unsigned NOT NULL,
bitmask SMALLINT(6) DEFAULT '0' NOT NULL,
CONSTRAINT `PRIMARY` PRIMARY KEY (groups_id, resources_id)
);
CREATE TABLE groups
(
groups_id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
groups_name VARCHAR(50) NOT NULL
);
Estou tentando obter uma lista restricted_components
com suas informações relacionadas do restante das tabelas, significando resources_name
e groups_name
.
Eu fiz esta consulta:
SELECT
`rc`.*,
`rs`.resources_name,
`gr`.`groups_name`
FROM `restricted_components` AS `rc`
LEFT JOIN `resources` AS `rs` ON rc.resources_id = rs.resources_id
LEFT JOIN `acl_groups_to_resources` AS `acl_gr` ON rs.resources_id = acl_gr.resources_id
LEFT JOIN `groups` AS `gr` ON acl_gr.groups_id = gr.groups_id
Mas está errado, pois tenho resultados indesejados conforme a imagem abaixo mostrada:
Tenho certeza de que o problema está no computador LEFT JOIN
, mas não consigo encontrar onde exatamente e como consertar isso.
Atualização nº 1: usar JOIN
em vez disso também não funciona.
Acredito que o problema esteja nos dados, mas não tenho certeza, espero que alguém tenha tempo para verificar isso.
Posso obter alguma ajuda?
Observação: deixei um conjunto de dados aqui para que você possa brincar com eles, se necessário, mas não é preciso, você precisará remover algumas colunas e seus valores.
Jogando com LEFT + INNER Você pode alterar a lógica da consulta SQL
Se você precisar de todos os componentes restritos - LEFT JOIN Mas porque os grupos devem ser para todos - INNER
resultado do seu conjunto de dados