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

标签 sql mysql join

我有 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/

相关文章:

mysql - 尝试通过 spring mvc 应用程序将 varchar 主键插入 mysql 时出错

sql - 使用数据库表作为队列

mysql - 如何在sql中选择特定的表?

Mysql查询SELECT同名字段

MySql:从同一表的三个不同列中提取不同的条目

当三列相等时,MySQL 合并两个非常大的表

sql - 删除表中的记录不在删除语句中?

php - mysql 一个依赖于另一个

mysql - 如何在不阻塞的情况下锁定mysql中的行?

mysql - 通过左连接/结果减少获得最低价格