php - 如何使用 php/mySQL 查询 3 个表,将所有类别保留在正确的表中?
问题描述
我有 3 张桌子。
- 相片
- 加入
- 类别我想记录每张照片的所有类别。
照片表:
连接表:
类别表:
此代码获取所有照片,但不会对类别进行分组。我只希望每张照片显示一次:
//define table
$tbl = "photos";
$joinsTbl = "joins";
$catsTbl = "categories";
//write query
$query = "SELECT $tbl.photoID, $tbl.photoSRC, $tbl.photoCredit, $joinsTbl.categoryID, $catsTbl.photo_category
FROM $tbl
LEFT JOIN $joinsTbl
INNER JOIN $catsTbl
ON $joinsTbl.categoryID = $catsTbl.categoryID
ON $tbl.photoID = $joinsTbl.photoID
LIMIT 100";
结果(问题是同一张照片的多个结果):
[{
"photoID": 1,
"photoSRC": "0112_copy.jpg",
"categoryID": null,
"category": null
}, {
"photoID": 2,
"photoSRC": "IMG_2484.jpg",
"categoryID": 2,
"category": "Deicing"
}, {
"photoID": 2,
"photoSRC": "IMG_2484.jpg",
"categoryID": 3,
"category": "Training"
}, {
"photoID": 2,
"photoSRC": "IMG_2484.jpg",
"categoryID": 6,
"category": "Familiarization"
}, {
"photoID": 2,
"photoSRC": "IMG_2484.jpg",
"categoryID": 7,
"category": "Vehicle"
}, {
"photoID": 3,
"photoSRC": "IMG_2492.jpg",
"categoryID": 3,
"category": "Training"
}, {
"photoID": 3,
"photoSRC": "IMG_2492.jpg",
"categoryID": 1,
"category": "Water"
}, {
"photoID": 3,
"photoSRC": "IMG_2492.jpg",
"categoryID": 2,
"category": "Deicing"
}, {
"photoID": 3,
"photoSRC": "IMG_2492.jpg",
"categoryID": 3,
"category": "Training"
}, {
"photoID": 3,
"photoSRC": "IMG_2492.jpg",
"categoryID": 4,
"category": "Instruction"
}, {
"photoID": 3,
"photoSRC": "IMG_2492.jpg",
"categoryID": 5,
"category": "Spray"
},
使用 GROUP BY
$query = "SELECT $tbl.photoID, $tbl.photoSRC, $tbl.photoCredit, $joinsTbl.categoryID, $catsTbl.photo_category
FROM $tbl
LEFT JOIN $joinsTbl
INNER JOIN $catsTbl
ON $joinsTbl.categoryID = $catsTbl.categoryID
ON $tbl.photoID = $joinsTbl.photoID
GROUP BY $tbl.photoID
LIMIT 100";
结果(问题仅出现 1 个类别):
[{
"photoID": 1,
"photoSRC": "0112_copy.jpg",
"categoryID": null,
"category": null
}, {
"photoID": 2,
"photoSRC": "IMG_2484.jpg",
"categoryID": 2,
"category": "Deicing"
}, {
"photoID": 3,
"photoSRC": "IMG_2492.jpg",
"categoryID": 3,
"category": "Training"
}, {
"photoID": 4,
"photoSRC": "IMG_20431.jpg",
"categoryID": 44,
"category": "Type I"
}, {
"photoID": 5,
"photoSRC": "IMG_3562.jpg",
"categoryID": null,
"category": null
}, {
"photoID": 6,
"photoSRC": "001pasp5.jpg",
"categoryID": 2,
"category": "Deicing"
}]
我想要得到什么(有多个类别):
{
"photoID": 2,
"photoSRC": "IMG_2484.jpg",
"photoCredit": "Michael Chaput",
"categoryID": 2,
"category": {"Deicing", "Training", "Scary", "Fluids"}
},
解决方案
考虑 MySQL 的GROUP_CONCAT
聚合:
$query = "SELECT $tbl.photoID, $tbl.photoSRC, $tbl.photoCredit, $joinsTbl.categoryID,
GROUP_CONCAT($catsTbl.photo_category SEPARATOR ',') AS categories
FROM $tbl
LEFT JOIN $joinsTbl
INNER JOIN $catsTbl
ON $joinsTbl.categoryID = $catsTbl.categoryID
ON $tbl.photoID = $joinsTbl.photoID
GROUP BY $tbl.photoID, $tbl.photoSRC, $tbl.photoCredit, $joinsTbl.categoryID
LIMIT 100"
推荐阅读
- java - spring-security-oauth2 自定义错误处理
- javascript - 猫鼬异步等待卡住了
- python - 使用请求 DRF 发布图像和数据失败
- android - 如何在同一个mixpanel项目token下识别同一设备上的多个不同用户?
- python - 无法使用 BeautifulSoup 刮标签,因为使用 Requests 登录不起作用
- javascript - react-native-appearance 第一次不听更改事件
- java - 重构 if-else 控制流
- javascript - 如何在 dataTable 导出期间创建 Loader
- c# - 按下发送按钮时标签文本不更新 - ASP.NET
- json - bash 脚本的新手无法理解以下代码