Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接表(mysql、php)_Php_Mysql_Join - Fatal编程技术网

连接表(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。。。