连接表(mysql、php)
我有这些桌子:连接表(mysql、php),php,mysql,join,Php,Mysql,Join,我有这些桌子: photos (photo_id, photo_title, path) photos_tags (id, photo_id, tag_id) tags (tag_id, tag_title). 在我的页面上,我正在显示照片及其标题,我想显示每张照片的标签,但我不知道如何显示 我想我应该使用左连接来连接表、照片、标签和标签,但我不知道从哪里开始。任何帮助都将不胜感激 Select photos.photo_title, photos.path, group
photos (photo_id, photo_title, path)
photos_tags (id, photo_id, tag_id)
tags (tag_id, tag_title).
在我的页面上,我正在显示照片及其标题,我想显示每张照片的标签,但我不知道如何显示
我想我应该使用左连接来连接表、照片、标签和标签,但我不知道从哪里开始。任何帮助都将不胜感激
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
如果你想得到没有标签的照片,那么你应该使用left join
如果您有很多标记,或者希望获得比标记名更多的数据,那么您应该准备两个查询。第二个是在包含照片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)
您需要将所有照片与其相应的标记进行左连接
这样做:
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
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}
这里有所有的标签,照片id
让我知道进一步的帮助。假设您有照片id($yourPhotoId)
特定照片的查询如下所示:
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
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}
对于所有照片(以及每个专栏):
具体照片如下:
//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
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
所有光点:
//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
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
试试这个
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
这是一种多对多的关系。如果不对结果进行分组,您的查询将重复照片。应用程序是否应将同一照片显示两次?我不这么认为。是的,只是因为在照片标签表中,第一张照片也有两个标签标签id 1和2。。。