gpt4 book ai didi

sql - (mySQL) 无法正确查询 2 个表的数据

转载 作者:可可西里 更新时间:2023-11-01 08:38:22 25 4
gpt4 key购买 nike

我有 2 个表。一个是“page_links”,另一个是“rpp”。表 page_links 是表 rpp 的超集。

以下是我的表的架构:

-- 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 值。例如,我想从 role_id = 3 的 rpp 中获取所有页面的 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

我想要的结果的另一个例子可以通过在 page_links.page = rpp.page 上执行 LEFT JOIN rpp 来实现,但我们需要省略使用 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

此查询不会返回 role_id 不是 3 且不为空的页面。

关于sql - (mySQL) 无法正确查询 2 个表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com