我试图得到的结果是我的查询3标签名称,而不是得到的tag_id。情况是这样的:
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_1
、attr_2
和attr_3
。
这就是我在问问题之前试过的。在这里,我可以得到referenced
值等于1的帖子:
SELECT post_id, attr_1, attr_2, attr_3, referenced
FROM posts
WHERE a.referenced = 1;
但在这里,试图改变name
中的attr_1
、attr_2
或attr_3
无法得到我想要的结果:
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
有人能帮我吗?
谢谢你的建议。
发布于 2015-04-23 12:24:35
一个非常有效的解决方案是为每个attr_加入一次名称表,如下所示:
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
给定您的样本数据,输出如下:
post_id attr_name attr_name attr_name referenced
2 name3 name1 1
4 name1 name4 1
5 name3 name1 name4 1
发布于 2015-04-23 12:22:23
您需要左联接才能获得每个值的名称:
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;
左联接将防止省略不匹配的行(如果存在的话)。
发布于 2015-04-23 12:19:29
您应该使3个join,每个attr值一个:
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
https://stackoverflow.com/questions/29823082
复制相似问题