Mysql 如何从SQL中的相关表中获取单个结果?
我有以下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 它从“产品”和“画
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中是否有唯一标识符?