首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将SQL语句命名为3个id标记

将SQL语句命名为3个id标记
EN

Stack Overflow用户
提问于 2015-04-23 12:11:50
回答 3查看 51关注 0票数 0

我试图得到的结果是我的查询3标签名称,而不是得到的tag_id。情况是这样的:

代码语言:javascript
运行
复制
create table names (
 ˋattr_idˋ int(11) unsigned not null auto_increment,
 ˋattr_nameˋ varchar(30),
 primary key(ˋattr_idˋ)
) engine=MyISAM

create table posts (
 ˋpost_idˋ int(5) unsigned not null auto_increment
 ˋattr_1 int(11) unsigned,
 ˋattr_2ˋ int(11) unsigned,
 ˋattr_3ˋ int(11) unsigned,
 ˋreferencedˋ int(5),
 primary key (ˋpost_idˋ)
) engine=MyISAM

insert into names (ˋattr_nameˋ) values 
(''),('name1'),('name2'),('name3'),('name4'),('name5'),('name6');

insert into posts (ˋattr_1ˋ, ˋattr_2ˋ, ˋattr_3ˋ, referenced) values
(1, 2, 3, null), (1, 4, 2, 1), (1, 3, 1, 2), (1, 2, 5, 1), (4, 2, 5, 1)

我试图获得的结果是referenced值等于post_id = 1的行,对于所有这些行,为names表中的attr_name更改其attr_1attr_2attr_3

这就是我在问问题之前试过的。在这里,我可以得到referenced值等于1的帖子:

代码语言:javascript
运行
复制
SELECT post_id, attr_1, attr_2, attr_3, referenced
FROM posts
WHERE a.referenced = 1;

但在这里,试图改变name中的attr_1attr_2attr_3无法得到我想要的结果:

代码语言:javascript
运行
复制
SELECT a.post_id, b.attr_name, b.attr_name, b.attr_name, a.referenced
FROM posts a, names b
WHERE a.referenced = 1 AND
      a.attr_1 = b.attr_id AND
      a.attr_2 = b.attr_id AND
      a.attr_3 = b.attr_id
GROUP BY a.post_id

有人能帮我吗?

谢谢你的建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-23 12:24:35

一个非常有效的解决方案是为每个attr_加入一次名称表,如下所示:

代码语言:javascript
运行
复制
SELECT p.post_id, n1.attr_name, n2.attr_name, n3.attr_name, p.referenced
FROM posts p
LEFT JOIN names n1 ON p.attr_1 = n1.attr_id
LEFT JOIN names n2 ON p.attr_2 = n2.attr_id
LEFT JOIN names n3 ON p.attr_3 = n3.attr_id
WHERE p.referenced = 1 

给定您的样本数据,输出如下:

代码语言:javascript
运行
复制
post_id attr_name       attr_name       attr_name   referenced
2                       name3           name1           1
4                       name1           name4           1
5       name3           name1           name4           1
票数 1
EN

Stack Overflow用户

发布于 2015-04-23 12:22:23

您需要左联接才能获得每个值的名称:

代码语言:javascript
运行
复制
SELECT post_id,
       att1.attr_name,
       att2.attr_name,
       att3.attr_name,
       referenced
FROM   posts a
       LEFT JOIN names att1
              ON a.attr_1 = att1.attr_id
       LEFT JOIN names att2
              ON a.attr_2 = att2.attr_id
       LEFT JOIN names att3
              ON a.attr_3 = att3.attr_id
WHERE  a.referenced = 1; 

左联接将防止省略不匹配的行(如果存在的话)。

票数 1
EN

Stack Overflow用户

发布于 2015-04-23 12:19:29

您应该使3个join,每个attr值一个:

代码语言:javascript
运行
复制
SELECT a.post_id, b1.attr_name, b2.attr_name, b3.attr_name, a.referenced
FROM posts a, names b1, names b2, names b3
WHERE a.referenced = 1 AND
      a.attr_1 = b1.attr_id AND
      a.attr_2 = b2.attr_id AND
      a.attr_3 = b3.attr_id
GROUP BY a.post_id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29823082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档