繁体   English   中英

联接表(mysql,php)

[英]Join tables (mysql, php)

我有这些表:

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

我在页面上显示照片,标题和每张照片的标签,但不知道如何显示。

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

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

如果您还想获取不带标签的照片,则应使用左联接。

如果您有很多标签,或者您想获得比标签名称更多的数据,那么您应该准备两个查询。 其次是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)

您需要为所有带有相应标签的照片添加左联接。

这样做:

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明智的选择。

让我知道进一步的帮助。

假设您具有照片ID($ 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

特定照片将如下所示:

//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

查看演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM