如何从SQL中的相关表中获取单个结果?

时间:2011-08-31 16:46:09

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

我有以下SQL查询:

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM 
 gallery, 
 products 
WHERE gallery.id=products.id

它从2个表中获取数据 - “产品”和“图库”。表“gallery”包含产品的图像。每个图像的ID都等于产品的ID。每个产品都有几个图像,所以如果我得到上面指定的查询数据,我将获得每个产品的所有图像。我需要获得1张图片。每个产品1张图片。我知道我可以使用DISTINCT关键字来完成它。但是我无法弄清楚应该如何使用我的查询。

4 个答案:

答案 0 :(得分:2)

您需要指定所需的图库中的哪些值。你要求你的数据库做的是随意丢弃你明确告诉它选择的记录。

有些人会做的是在他们不想复制的列中添加MAXMIN。每次我看到这样做都是因为他们在查询中有错误的逻辑......

实际试图从图库中选择什么?如果我们知道我们可以帮助您编写查询。

<强>更新

此方法使用apply仅获取每个产品的第一个图库记录(按gallery.id排序)。

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM  
 products p
OUTER APPLY
        (
        SELECT  TOP 1 g.id, g.thumbnail_big,
        FROM    gallery g
        WHERE   g.id= p.id
        ORDER BY
                g.id DESC
        ) g

答案 1 :(得分:2)

由于您使用的是MySQL,我将为您提供一个非常简单的特定于MySQL的解决方案:

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM gallery
INNER JOIN products 
ON gallery.id=products.id
GROUP BY products.id

当然这会返回一个任意的gallery.id和thumbnail_big,但是你还没有指定你想要的那个。在实践中,它将首先存储在表格中,但你几乎无法控制它。

上面的查询不明确,因此ANSI SQL和大多数品牌的RDBMS都不允许这样做。但MySQL允许它(SQLite也是如此,它的价值)。

更好的解决方案是使查询不含糊。例如,如果要获取具有最高主键值的库图像:

SELECT 
 g1.id, 
 g1.thumbnail_big, 
 p.id, 
 p.title, 
 p.size, 
 p.price, 
 p.text_description, 
 p.main_description 
FROM products p
INNER JOIN gallery g1 ON p.id = g1.id
LEFT OUTER JOIN gallery g2 ON p.id = g2.id AND g1.pkey < g2.pkey
WHERE g2.id IS NULL

我必须假设您有另一列gallery.pkey自动增量,或者用于唯一地区分给定产品的图库图像。如果您没有这样的列,则需要创建一个。

然后查询尝试查找同一产品的行g2,大于g1。如果不存在这样的行,则g1必须是最大的行。

答案 2 :(得分:0)

通过/有组合的完美候选人。

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM 
 products,
 gallery 

WHERE gallery.id=products.id
GROUP BY products.id
HAVING MIN(gallery.id)

将返回所有产品,每个产品一张图片。但是,图像的选择是具有最小id的图像。

答案 3 :(得分:-1)

你没有说你显示哪张照片很重要,所以这是获得一张照片的最简单方法:

SELECT 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description,
 MAX(gallery.thumbnail_big) AS thumbnail_big, 
FROM 
 products,
 gallery
WHERE
 products.id = gallery.id
GROUP BY
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description,