2011-12-20 54 views
0

所以我有2个表...产品和形象SQL查询联接结果限制为一个项目每ID

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 

我得到的结果,但它给了我多个条目,我只想要每个产品的一个结果,我希望它拉起TH Ë形象,加入FIRST(所以最古老的一个)......

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

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 

这有道理吗?任何人都可以帮我弄清楚我的问题吗?

+0

你用什么标准选择name5.jpg而不是name6.jpg?它只是一个随机选择,或者你有明确的东西? – alexm 2011-12-20 23:07:03

+0

我想'选择不同'可能工作? – 2011-12-20 23:08:10

+0

最早的文件按时间顺序排列,所有图像都有一个时间戳,所以我可能会按时间戳排序,但我认为数据库检索时间无论如何,所以没有必要在查询中包含时间戳逻辑 – 2011-12-20 23:08:22

回答

3

像这样的东西可以工作,但你必须检查它的错别字。

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 
+0

只是一个评论。最早的文件按时间顺序暗示'ORDER BY i.date_created ASC'。它不是? – danihp 2011-12-20 23:13:33

+0

@danihp - 日期。呸。感谢指针,你是对的。 – 2011-12-20 23:15:40

+0

工作得很好!谢谢! – 2011-12-21 00:03:40

1

您需要在图像表中存储每个图像添加日期和时间的列。然后,你应该能够做到这一点(我希望,不知道如果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) 
3

添加“由p.id组”在您的查询的末尾应该做的工作,但现在你不不知道你得到了什么样的形象。

再见

赞布罗塔

+0

这实际上适用于我想要的,但我正在与上面那个合并子查询的人合作,因为它保证我得到正确的。尽管伟大的尝试,为我赢得了赞赏。 :) – 2011-12-20 23:26:58

0

我用images.id作为我的方法来确定最老的。您可以使用日期或日期时间字段,但是如果同时为该产品添加了多个图像,您将获得多个记录,除非查询进一步修改以解释可能性。我猜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