2015-01-21 35 views
1

我有这些表:加入表(MySQL和PHP)

photos (photo_id, photo_title, path) 
photos_tags (id, photo_id, tag_id) 
tags (tag_id, tag_title). 

在我的网页我显示照片,其标题和我想要显示每张照片的标签,但我不知道怎么办。

我想我应该使用LEFT JOIN来连接表格photos_tags和标签,但我不知道从哪里开始。任何帮助,将不胜感激!

回答

2
Select 
    photos.photo_title, 
    photos.path, 
    group_concat(tags.tag_title) as tags 
from photos 
inner join photos_tags on photos.photo_id = photos_tags.photo_id 
inner join tags on tags.tag_id = photos_tags.tag_id 
group by photos.photo_id 

如果你想获得没有标签的照片,那么你应该使用左连接。

如果您有很多标签,或者您希望获取比标签名称更多的数据,那么您应该准备2个查询。其次与in运算符包含照片ID列表。因此,首先获得所有的照片

select * from photos 

然后让所有的ID,并传递给需要左联接与它们对应的标签的所有照片第二查询

select * from tags 
inner join photos_tags on photos_tags.tag_id = tags.tag_id 
where photos_tags.photo_id in (1,2,3,4) 
0

。明智

SELECT P.*, T.tag_title FROM photos P 
LEFT JOIN photos_tags PT ON P.photo_id = PT.photo_id 
LEFT JOIN tags T ON T.tag_id = PT.tag_id 

在这里,你得到所有的标签,照片ID:

做这样的。

让我知道进一步的帮助。

+0

这是多对多的关系。没有分组结果您的查询将重复照片。 – 2015-01-21 10:29:54

0

假设你有你的照片的证件($ yourPhotoId) 为特定的照片查询会是这样的:

SELECT t.tag_id, t.tag_title 
FROM photo_tags pt 
LEFT JOIN tags t ON t.tag_id = pt.tag_id 
WHERE pt.photo_id = {$yourPhotoId} 

,并为所有的照片(每列):

SELECT * 
FROM photos p 
LEFT JOIN photo_tags pt ON pt.photo_id = p.photo_id 
LEFT JOIN tags t ON t.tag_id = pt.tag_id 
0

特定的照片会是这样:

//photo_id just example 
$photo_id = '1'; 
SELECT pt.id as id, pt.photo_id as photo_id, pt.tag_id as tag_id, t.tag_title, p.photo_title, p.path FROM photos p 
INNER JOIN photo_tags pt ON pt.photo_id = $photo_id 
INNER JOIN tags t ON t.tag_id = pt.tag_id 

所有Phosts:

SELECT pt.id as id, pt.photo_id as photo_id, pt.tag_id as tag_id, t.tag_title, p.photo_title, p.path FROM photos p 
INNER JOIN photo_tags pt ON pt.photo_id = p.photo_id 
INNER JOIN tags t ON t.tag_id = pt.tag_id 
0

试试这个

SELECT P.*, T.tag_title FROM photos P 
JOIN photo_tags PT ON P.photo_id = PT.photo_id 
LEFT JOIN tags T ON T.tag_id = PT.tag_id 
WHERE t.tag_id = 1 

SEE DEMO

+0

而应用程序应显示相同的照片2次?我不这么认为。 – 2015-01-21 14:26:18

+0

是的,只是因为在photo_tags表第一张照片有两个标签tag_id 1和2以及... – 2015-01-22 04:20:57

+0

我已经更新了答案 – 2015-01-22 04:28:35