我有以下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关键字来完成它。但是我无法弄清楚应该如何使用我的查询。
答案 0 :(得分:2)
您需要指定所需的图库中的哪些值。你要求你的数据库做的是随意丢弃你明确告诉它选择的记录。
有些人会做的是在他们不想复制的列中添加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
答案 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,