2015-04-23 53 views
0

我試圖得到作爲我的查詢3標籤名稱而不是獲取tag_id的結果。情況是這樣的:SQL句子的名稱3 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併爲所有這些行的行,更改attr_name這是在其attr_1attr_2attr_3names表。

這就是我在提問之前所嘗試過的。在這裏我能得到與後referenced值等於1:

SELECT post_id, attr_1, attr_2, attr_3, referenced 
FROM posts 
WHERE a.referenced = 1; 

但在這裏,試圖改變name insted的的attr_1attr_2attr_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 

莫非有人幫助我呢?

感謝您的建議。

+0

一般GROUP BY規則說: 如果指定了GROUP BY子句,則SELECT列表中的每個列引用都必須標識分組列或作爲set函數的參數。 – jarlh

回答

1

一個非常有效的解決方案是加入了名稱表一次,每次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 
0

你應該讓3加入,每個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 
+2

請不要鼓勵pre-ANSI SQL-92隱式聯接......而是使用顯式聯接。 – jpw

1

你離開需要加入讓每個值的名稱:

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; 

左連接將阻止忽略不匹配的行(如果當下)。