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 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥15 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)