【问题标题】:How to select a photo from the photo table for each post by query in MySQL如何通过 MySQL 中的查询从照片表中为每个帖子选择一张照片
【发布时间】:2019-03-16 11:51:23
【问题描述】:

我有两张表,我想为每张帖子显示一张照片,但是当运行查询为每张照片显示帖子时

照片表:

+------------------------------------------------------------+
|  photo_id   |    post_id    |    photo_name                |
+------------------------------------------------------------+
|     1       |        1      |    flower.jpg                |
+------------------------------------------------------------+
|     2       |        1      |    book.jpg                  |
+------------------------------------------------------------+
|     3       |        2      |    pen.jpg                   |
+------------------------------------------------------------+
|     4       |        3      |    man.jpg                   |
+------------------------------------------------------------+
|     5       |        3      |    women.jpg                 |
+------------------------------------------------------------+
|     6       |        3      |    boy.jpg                   |
+------------------------------------------------------------+

张贴表:

+--------------------------------+
|  post_id    |   post_title     |
+--------------------------------+
|     1       |   flower         |
+--------------------------------+
|     2       |   book           |
+--------------------------------+
|     3       |   pen            |
+--------------------------------+
|     4       |   man            |
+--------------------------------+
|     5       |   women          |
+--------------------------------+
|     6       |   boy            |
+--------------------------------+

使用流动的 SQL 查询和 INNER JOIN 但我的结果显示如下:

SELECT
Photo.photo_name,
Post.post_title
FROM Photo
INNER JOIN Post
ON Photo.post_id = Post.post_id 
ORDER BY Post.post_id 

执行后查询结果:

+-----------------------------+
|  post_title |   photo_name  |
+-----------------------------+
|     flower  |  flower.jpg   |
+-----------------------------+
|     flower  |  flower.jpg   |
+-----------------------------+
|     book    |  book.jpg     |
+-----------------------------+
|     book    |  book.jpg     |
+-----------------------------+
|     pen     |  pen.jpg      |
+-----------------------------+
|     pen     |  pen.jpg      |
+-----------------------------+
|     man     |  man.jpg      |
+-----------------------------+
|     man     |  man.jpg      |
+-----------------------------+
|     women   |  women.jpg    |
+-----------------------------+
|     women   |  women.jpg    |
+-----------------------------+
|     boy     |  boy.jpg      |
+-----------------------------+
|     boy     |  boy.jpg      |
+-----------------------------+

我在帖子表中有 6 个帖子,我想为每个帖子获取一张照片,但我的结果按照片数显示帖子

【问题讨论】:

  • 您的查询和数据不匹配。照片 6 显示与帖子 3 相关,但您的结果显示它与帖子 6 (根据您的数据实际上没有与之关联的照片)。请显示表格的实际内容 - 这可能是您重复的来源。
  • 我想知道他是如何通过数据和查询示例获得该结果的@MatBailie db-fiddle.com/f/eo5kTSwyQqmNKCc6cURtY8/0
  • @RaymondNijland - 该查询的数据无法生成该结果。然而,OP在没有纠正矛盾的情况下接受了答案。愿“注重细节”的众神慈悲。

标签: mysql sql sqlcommand


【解决方案1】:

您可以使用group by。由于您还没有定义在一个帖子有多张照片的情况下使用哪张照片,我们可以获得Max()一个帖子的照片:

SELECT
MAX(Photo.photo_name),
Post.post_title
FROM Photo
INNER JOIN Post
ON Photo.post_id = Post.post_id 
GROUP BY Post.post_id, Post.post_title 
ORDER BY Post.post_id 

【讨论】:

  • 这可能只是一种隐藏 OP 认为 在表格中不是 真的在表格中。在 OP 澄清表中的真正内容以及表中应该包含的内容之前,修复表可能是正确的方法(而不是浪费复杂性和服务器资源来隐藏潜在问题)
  • @MatBailie 为什么一个帖子不能有多张照片。对我来说,它看起来像一个普通的用例。
  • @MatBailie 我不是 OP :-)
  • @MadhurBhaiya - 好点 :) 希望我的观点仍然清楚;这解决了一个假设的问题,因为 OP 的自相矛盾问题可能可以通过修复数据来更好地解决。我先去角落里躲一会儿。
  • @T3RON 你确定你的表不包含重复的数据,因为如果我执行你的示例数据并查询db-fiddle.com/f/eo5kTSwyQqmNKCc6cURtY8/0 我无法重现你的结果..
【解决方案2】:

假设您希望所有帖子都至少包含一张照片(我不知道是哪一张)。所以,我会用子查询做LEFT JOIN

SELECT pst.post_title, p.photo_name
FROM Post pst LEFT JOIN 
     Photo p
     ON p.post_id = pst.post_id AND 
        p.photo_id = (SELECT MAX(p1.photo_id)
                      FROM Photo p1
                      WHERE p1.post_id = p.post_id
                     );

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多