2010-01-02 4 views
3

J'ai 2 tables. L'un est 'page_links' et l'autre est 'rpp'. La table page_links est le surensemble de la table rpp.(mySQL) Impossible d'interroger 2 tables correctement pour les données

Voici le schéma de mes tables:

-- Table structure for table `page_links` 
-- 

CREATE TABLE IF NOT EXISTS `page_links` (
    `page` varchar(255) NOT NULL, 
    `page_link` varchar(100) NOT NULL, 
    `heading_id` tinyint(3) unsigned NOT NULL, 
    PRIMARY KEY (`page`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `page_links` 
-- 

INSERT INTO `page_links` (`page`, `page_link`, `heading_id`) VALUES 
('a1.php', 'A1', 8), 
('b1.php', 'B1', 8), 
('c1.php', 'C1', 5), 
('d1.php', 'D1', 5), 
('e1.php', 'E1', 8), 
('f1.php', 'F1', 8), 
('g1.php', 'G1', 8), 
('h1.php', 'H1', 1), 
('i1.php', 'I1', 1), 
('j1.php', 'J1', 8), 
('k1.php', 'K1', 8), 
('l1.php', 'L1', 8), 
('m1.php', 'M1', 8), 
('n1.php', 'N1', 8), 
('o1.php', 'O1', 8), 
('p1.php', 'P1', 4), 
('q1.php', 'Q1', 5), 
('r1.php', 'R1', 4); 


-- Table structure for table `rpp` 
-- 

CREATE TABLE IF NOT EXISTS `rpp` (
    `role_id` tinyint(3) unsigned NOT NULL, 
    `page` varchar(255) NOT NULL, 
    `is_allowed` tinyint(1) NOT NULL, 
    PRIMARY KEY (`role_id`,`page`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `rpp` 
-- 

INSERT INTO `rpp` (`role_id`, `page`, `is_allowed`) VALUES 
(3, 'a1.php', 1), 
(3, 'b1.php', 1), 
(3, 'c1.php', 1), 
(3, 'd1.php', 1), 
(3, 'e1.php', 1), 
(3, 'f1.php', 1), 
(3, 'h1.php', 1), 
(3, 'i1.php', 1), 
(3, 'l1.php', 1), 
(3, 'm1.php', 1), 
(3, 'n1.php', 1), 
(4, 'a1.php', 1), 
(4, 'b1.php', 1), 
(4, 'q1.php', 1), 
(5, 'r1.php', 1); 

Ce que je veux FAIRE:

Je suis en train d'interroger les deux tableaux ci-dessus (en une seule requête) de telle sorte que toutes les pages de page_links sont affichées avec la valeur is_allowed de rpp pour un rôle particulier. Par exemple, je veux obtenir la valeur is_allowed de toutes les pages de rpp pour role_id = 3 et en même temps, liste toutes les pages disponibles de page_links. Un exemple clair de mon résultat attendu serait:

page  is_allowed role_id 
---------------------------------------- 
a1.php 1    3 
b1.php 1    3 
c1.php 1    3 
d1.php 1    3 
e1.php 1    3 
f1.php 1    3 
g1.php NULL   NULL 
h1.php 1    3 
i1.php 1    3 
j1.php NULL   NULL 
k1.php NULL   NULL 
l1.php 1    3 
m1.php 1    3 
n1.php 1    3 
o1.php NULL   NULL 
p1.php NULL   NULL 
q1.php NULL   NULL 
r1.php NULL   NULL 

Un autre exemple de mon résultat désiré pourrait être obtenu en faisant une LEFT JOIN SUR page_links.page = rpp rpp.page mais nous avons besoin d'omettre l'aide role_id = 3 (ou n'importe quelle valeur) pour être en mesure d'obtenir cela. Mais je veux aussi spécifier le role_id et obtenir les résultats. J'ai besoin de la requête pour pouvoir obtenir ce résultat. J'apprécierais toutes les réponses qui pourraient m'aider avec ceci. Si vous pouvez me suggérer des changements aussi bien dans la conception de la table que dans le but d'obtenir le résultat souhaité, c'est bien aussi. Merci d'avance.

+0

+1 pour fournir des scripts de création, des données de test ET une sortie attendue. J'aimerais pouvoir donner plus. –

+0

@Mark, Merci beaucoup. J'aimerais pouvoir accepter votre réponse, mais ça ne me le permettrait pas. Peut-être la prochaine fois .. :) – Devner

Répondre

1

Utilisation:

SELECT pl.page, 
      r.is_allowed, 
      r.role_id 
    FROM PAGE_LINKS pl 
LEFT JOIN RPP r ON r.page = pl.page 
       AND OR r.role_id = 3 

Auparavant:

SELECT pl.page, 
      r.is_allowed, 
      r.role_id 
    FROM PAGE_LINKS pl 
LEFT JOIN RPP r ON r.page = pl.page 
    WHERE r.role_id IS NULL OR r.role_id = 3 

Cette requête ne renvoie les pages qui ont un role_id autre que 3 et qui ne sont pas nuls.

+0

Merci pour la solution. Ça a marché! – Devner

+0

@OMG: nos solutions donnent des résultats différents. Je pense qu'il vous manque q1 et r1 car la clause WHERE ne correspond pas. –

+0

@OMG: Merci pour la correction. Lorsque j'ai vérifié la requête, cela a bien fonctionné. Peut-être que j'ai encore besoin de le tester à fond. Je travaille toujours avec des données de test très limitées. Mais en ce qui concerne la solution de Mark, j'ai eu l'impression que c'était la réponse à la question. Merci OMG, Mark. – Devner

1

Essayez ceci:

SELECT page_links.page, is_allowed, role_id 
FROM page_links 
LEFT JOIN rpp 
ON rpp.page = page_links.page AND rpp.role_id = 3 
+0

Salut, Merci pour la solution. Votre solution a également fonctionné. J'ai aussi essayé d'accepter votre réponse, mais elle désélectionne la réponse précédente que j'avais déjà choisie et ne me laisserait pas sélectionner la vôtre. Je pense que le système ne me permet pas d'accepter deux réponses en même temps. Mais j'ai obtenu votre solution et apprécie vos efforts et en tant que tel, j'ai voté votre réponse. Merci beaucoup. – Devner

0
SELECT page_links.page, new_rpp.is_allowed, new_rpp.role_id 
FROM page_links LEFT JOIN (SELECT * FROM rpp where role_id = 3) as new_rpp USING(page) 

Cela vous donnera les résultats souhaités, il montrera non seulement les pages qui correspondent à ROLE_ID = 3, mais montrera aussi toutes les pages qui ne sont pas une entrée correspondante dans la table rpp pour role_id = 3 Cela devrait donc produire l'ensemble de résultats que vous désirez.

Questions connexes