选择查询中的两个级别连接

时间:2017-05-14 11:06:02

标签: php mysql sql

我有3个表:poststagspost_tags

post_tags中的

我存储帖子标签!帖子可以有很多标签

现在我想在选择帖子自己的列时选择帖子1的所有标签名称。

帖子列为:idtitle
标签列为:idname
post_tags列为:idpost_idtag_id

我已到达此处,但这只返回一个标记名称,而不是所有标记:(任何想法?)

select 
     p.*, t.name as tag_name 
from 
     posts p 
     inner join posts_tags pt on p.id = pt.post_id 
     inner join tags t on pt.tag_id = t.id 
where 
     p.id = 1 limit 1

2 个答案:

答案 0 :(得分:0)

如果您想要一行上的所有标记,您可以汇总结果并使用group_concat()

select p.*, group_concat(t.name) as tag_name 
from posts p inner join
     posts_tags pt on p.id = pt.post_id inner joi
     tags t on pt.tag_id = t.id 
where p.id = 1
group by p.id;

这是有一次* select group byid一起使用,因为fileprivate let defaults = UserDefaults.standard func storeValue(_ value: AnyObject, forKey key:String) { defaults.set(value, forKey: key) defaults.synchronize() NotificationCenter.default.post(name: Notification.Name(rawValue: "persistanceServiceValueChangedNotification"), object: key) } func getValueForKey(_ key:String, defaultValue:AnyObject? = nil) -> AnyObject? { return defaults.object(forKey: key) as AnyObject? ?? defaultValue } 在表格中是唯一的。这种用法甚至被ANSI标准所宽恕。

答案 1 :(得分:0)

试试这个:从posts_tags中选择id = 1的所有帖子,每个帖子都带有相应的标签 - 详细信息:

select 
     pt.id, // Optional
     pt.post_id, // Optional
     p.title,
     t.name as tag_name 
from 
    posts_tags as pt
    left join posts as p on p.id = pt.post_id
    left join tags as t on t.id = pt.tag_id
where 
     pt.post_id = 1
;