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

Mysql 如何从SQL中的相关表中获取单个结果?,mysql,sql,distinct,greatest-n-per-group,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 它从“产品”和“画

我有以下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

它从“产品”和“画廊”两个表格中获取数据。表“gallery”包含产品的图像。每个图像都有其ID,该ID等于产品的ID。每个产品都有多个图像,因此如果我按照上面指定的查询获得数据,我将获得每个产品的所有图像。我需要得到一张图片。每个产品1张图片。我知道我可以使用DISTINCT关键字来完成。但是,我不知道该如何与我的查询一起使用。

您需要从gallery中指定所需的值。您要求数据库做的是任意删除您特别要求它选择的记录

有些人会在他们不想复制的列中添加一个
MAX
MIN
。每次我看到这样做,都是因为他们的查询逻辑有问题

你到底想从图库中选择什么?如果我们知道,我们可能可以帮助编写您的查询

更新

此方法使用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

您不会说显示哪张图片很重要,所以这是获得一张图片的最简单方法:

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,

通过组合/具有组合,是团队的完美候选人

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的图像。

由于您使用的是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和缩略图,但您尚未指定要使用哪一个。实际上,它将首先物理存储在表中,但您对此几乎没有控制权

上面的查询是不明确的,所以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
选择
g1.id,
g1.U大,
p、 身份证,
p、 头衔,
p、 大小,
p、 价格,
p、 文字说明,
p、 主要描述
来自产品p
p.id=g1.id上的内部连接通道g1
p.id=g2.id和g1.pkey
我必须假设您有另一个列
gallery.pkey
,它是自动递增的,或者用于唯一区分给定产品的画廊图像。如果没有这样的列,则需要创建一个列


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

感谢您的回复。假设“product”表中有一个产品项,其ID为123。该产品在表“gallery”中有两个图像,它们都具有ID 123-以便更容易地参考这些图像所属的产品。所以,我只需要从ID为123的“gallery”表中选择一个图像,这不取决于哪个图像,而只取决于一个图像。ID-s是随机的,所以“最大”和“最小”都没有帮助。如果您不关心从子表的哪一行检索数据,则没有错误的逻辑。@cycero,那么从gallery中选择哪个图像无关紧要?它必须是产品的产物吗?@Abe Miessler,是的,我需要每个产品有一张图片。实际上,我正在浏览列表,并为每个产品打印一张图片。好的,看看我发布的查询。应该适合您的需要这还假设您不需要结果集中的gallery.id。gallery中是否有唯一标识符?