MySQL 中的嵌套选择

发布于 2024-10-20 12:31:28 字数 1217 浏览 0 评论 0原文

设置

我网站上的每个页面都有四个按不同顺序排列的小部件 (1-4)。 我有一个表“内容”和表“小部件”。我有一个桥接表,将 content.id 映射到 widgets.content_id。

问题

我想要做的是运行一个查询,从内容中选择 * 以及附加列 widget_1、widget_2、widget_3、widget_4,每个列都包含链接到该页面的小部件的 ID。

我整个早上都在尝试一些嵌套选择,但似乎无法破解它。我已经复制了下面涉及的表的 MySQL 转储:-)。

CREATE TABLE `content` (
  `id` int(11) NOT NULL auto_increment,
  `permalink` varchar(64) character set latin1 NOT NULL,
  `parent` int(11) NOT NULL default '1',
  `title` varchar(128) character set latin1 NOT NULL,
  `content` text character set latin1,
  `content_type` varchar(16) NOT NULL default 'page',
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `title` (`title`,`content`,`meta_description`,`meta_keywords`)
)


CREATE TABLE `widgets` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `title` varchar(64) default NULL,
  `text` varchar(256) default NULL,
  `image` varchar(128) default NULL,
  `target` varchar(128) default NULL,
  `code` varchar(32) default NULL,
  PRIMARY KEY  (`id`)
)

CREATE TABLE `content_widgets` (
  `content_id` int(11) NOT NULL,
  `widget_id` int(11) NOT NULL,
  `order` tinyint(4) NOT NULL
)

多谢!

Setting:

Each page on my site has four widgets that are arranged in different orders (1-4).
I have a table 'content' and table 'widgets'. I have a bridging table that maps content.id to widgets.content_id.

Problem:

What I want to do is run a query that selects * from content along with addition columns widget_1, widget_2, widget_3, widget_4, each containing the id of the widget linked to that page.

I've been trying some nested selects all morning and can't seem to crack it. I've copied the MySQL dumps of the involved tables below :-).

CREATE TABLE `content` (
  `id` int(11) NOT NULL auto_increment,
  `permalink` varchar(64) character set latin1 NOT NULL,
  `parent` int(11) NOT NULL default '1',
  `title` varchar(128) character set latin1 NOT NULL,
  `content` text character set latin1,
  `content_type` varchar(16) NOT NULL default 'page',
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `title` (`title`,`content`,`meta_description`,`meta_keywords`)
)


CREATE TABLE `widgets` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `title` varchar(64) default NULL,
  `text` varchar(256) default NULL,
  `image` varchar(128) default NULL,
  `target` varchar(128) default NULL,
  `code` varchar(32) default NULL,
  PRIMARY KEY  (`id`)
)

CREATE TABLE `content_widgets` (
  `content_id` int(11) NOT NULL,
  `widget_id` int(11) NOT NULL,
  `order` tinyint(4) NOT NULL
)

thanks a lot!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

稳稳的幸福 2024-10-27 12:31:28

您不需要嵌套查询 - 只需要一个联接。假设您想从内容记录开始并返回匹配的小部件......

SELECT c.*, w.*
FROM content c
   LEFT JOIN (
      content_widgets cw INNER JOIN widgets w
      ON cw.widget_id=w.id
   ) ON c.id=cw.id
WHERE c.id=....

尽管简单的内部连接是一个更好的主意,您知道您已经拥有了小部件:

SELECT c.*, w.*
FROM content c, content_widgets cw widgets w
WHERE cw.widget_id=w.id
AND c.id=cw.id
AND c.id=....

You don't need a nested query - just a join. Assuming that you want to start with a content record and return the matching widgets....

SELECT c.*, w.*
FROM content c
   LEFT JOIN (
      content_widgets cw INNER JOIN widgets w
      ON cw.widget_id=w.id
   ) ON c.id=cw.id
WHERE c.id=....

Although a simple innter join is a better idea of you know you've got the widgets:

SELECT c.*, w.*
FROM content c, content_widgets cw widgets w
WHERE cw.widget_id=w.id
AND c.id=cw.id
AND c.id=....
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文