dongnanke4106 2018-06-19 18:09
浏览 58
已采纳

如何查询3个表,使用php / mySQL,保留右表中的所有类别?

I have 3 tables.

  • photos
  • joins
  • categories I would like to get a record of each photo with all of it's categories.

photos table:

photos table

joins table:

joins table

categories table:

enter image description here

This code gets all of the photos, but doesn't group the categories. I only want each photo to display once:

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

result (where the problem is multiple results for the same photo):

    [{
    "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"
},

Using 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";

Result (where the problem is only 1 of the categories appears):

[{
    "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"
}]

What I am trying to get (with multiple categories):

{
    "photoID": 2,
    "photoSRC": "IMG_2484.jpg",
    "photoCredit": "Michael Chaput",
    "categoryID": 2,
    "category": {"Deicing", "Training", "Scary", "Fluids"}
}, 

</div>
  • 写回答

2条回答 默认 最新

  • dongyong1897 2018-06-19 18:19
    关注

    Consider MySQL's GROUP_CONCAT aggregate:

    $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"
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错