(mySQL)无法正确查询2个表的数据
我有2个表。一个是'page_links',另一个是'rpp'。表page_links是表rpp的超集。(mySQL)无法正确查询2个表的数据
以下是我的表的架构:
-- 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);
我所试图做的事:
我想查询上面两个表(在单个查询)以这种方式,来自page_links的所有页面都将与来自rpp的is_allowed值一起显示给特定角色。例如,我想从rpp中为role_id = 3获取所有页面的is_allowed值,同时列出page_links中的所有可用页面。我期望的结果的一个明显的例子是:
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
我想要的结果的又一个例子可以通过做一个LEFT JOIN RPP ON page_links.page = rpp.page来实现,但是我们需要用省略ROLE_ID = 3 (或任何值)能够得到。但我也想指定role_id并获得结果。 我需要查询才能够得到这个结果。我将不胜感激任何回复,可以帮助我。如果您可以建议我对桌子设计进行任何更改以达到预期效果,那也是很好的做法。提前致谢。
回答:
用途:
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
以前:
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
这个查询不会返回比3以外的ROLE_ID并且不为空页。
回答:
试试这个:
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
回答:
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)
这会给你你想要的结果,它不仅会显示对应ROLE_ID = 3的页面也将显示所有不具有该页面在rpp表中为role_id = 3的对应项目 所以这应该会产生你所期望的结果集。
以上是 (mySQL)无法正确查询2个表的数据 的全部内容, 来源链接: utcz.com/qa/261287.html