【问题标题】:SQL Query Join Limit Results to One Item Per IDSQL 查询联接将结果限制为每个 ID 一项
【发布时间】:2011-12-20 23:02:56
【问题描述】:

所以我有 2 张桌子......产品和图片

Products 
---------
id
value1
value2
value3
etc..

Images
---------
id
productId
imageName

每个产品的图像表将包含多个图像,因此当我运行此查询时: (!= 0 是因为有些图像没有 productId,所以我想排除它们,不确定是否有更好的方法来处理它,或者我什至需要包含它)

select p.*, i.imageName 
from products p, images i 
where p.id = i.productId and i.productId != 0 

我得到了结果,但它给了我多个条目,我只想要每个产品一个结果,我希望它拉出首先添加的图像(所以是最旧的)......

目前的结果是这样的---

id : 1
imagename: name1.jpg

id : 2
imagename: name5.jpg

id: 2
imagename: name6.jpg

id: 2
imagename: name7.jpg

id: 3
imagename:  name3.jpg

etc... etc... 

我希望它看起来像这样......

id: 1
imagename: name1.jpg

id: 2
imagename: name5.jpg

id: 3
imagename: name 3.jpg

这有意义吗?谁能帮我解决我的问题?

【问题讨论】:

  • 您使用什么标准来选择 name5.jpg 而不是 name6.jpg?这只是随机选择还是您有明确的内容?
  • 我猜select distinct 可能有用吗?
  • 按时间顺序最旧的文件,所有图像上都有时间戳,所以我可能会按时间戳排序,但我认为数据库无论如何都会检索 chrono,因此可能没有必要在查询中包含时间戳逻辑跨度>
  • 我添加了greatest-n-per-group 标签。按照这个标签在 SQL 中为这个问题提供几十个答案。

标签: mysql sql join greatest-n-per-group


【解决方案1】:

这样的事情会起作用,尽管你必须检查它是否有错别字。

SELECT p.*,
       (SELECT i.imageName
          FROM images
         WHERE i.productId = p.id
        ORDER BY i.date_created ASC
         LIMIT 1)
          AS imageName
  FROM products p

【讨论】:

  • 只是一个评论。最旧的文件按时间顺序暗示ORDER BY i.date_created ASC。不是吗?
  • @danihp - 日期。呸。谢谢你的指点,你是对的。
【解决方案2】:

在查询末尾添加“group by p.id”应该可以完成工作,但现在您不知道得到什么图像。

再见

詹卢卡

【讨论】:

  • 这实际上适用于我想要的,但我会选择上面包含子选择的那个,因为它保证我得到正确的那个。不过,伟大的尝试让你赢得了我的支持。 :)
【解决方案3】:

您需要在图片表中有一列存储每张图片的添加日期和时间。那么你应该能够做到这一点(我希望,不知道 MySQL 是否允许):

select p.*, i.imageName 
  from products p, images i 
 where p.id = i.productId 
   and i.productId != 0 
   and i.addedDate = (select min(i2.addedDate)
                        from images i2
                       where i2.productId = p.id)

【讨论】:

    【解决方案4】:

    我使用 images.id 作为确定最旧的方法。您可以使用日期或日期时间字段,但如果同时为该 productid 添加了多个图像,您将获得多条记录,除非进一步修改查询以考虑这种可能性。我猜 image.id 是独一无二的,所以不会有这个问题

    select p.id
         , im.imageName
      from products p
    left
      join ( select id
                  , theDate
                  , imageName
               from images
               join (select min(id) minId
                             from images
                          group 
                              by productId) oldestImages
                 on oldestImages.minId = images.id
      ) im
      on im.productId = p.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多