数据库
首页 > 数据库> > mysql-如何从SQL中的相关表中获得单个结果?

mysql-如何从SQL中的相关表中获得单个结果?

作者:互联网

我有以下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个表(“产品”和“图库”)中获取数据.表“图库”包含产品的图像.每个图像的ID均与产品ID相同.每个产品都有多个图像,因此,如果像上面指定的查询一样获取数据,则将获得每个产品的所有图像.我需要得到1张图片.每个产品1张图片.我知道我可以使用DISTINCT关键字来做到这一点.但是我不知道应该如何与我有查询一起使用.

解决方法:

由于您使用的是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必须是最大的行.

标签:distinct,greatest-n-per-group,sql,mysql
来源: https://codeday.me/bug/20191208/2088066.html