INNER JOIN:第二张表的限制为 0,1
Posted
技术标签:
【中文标题】INNER JOIN:第二张表的限制为 0,1【英文标题】:INNER JOIN: limit 0,1 on the second table 【发布时间】:2011-03-12 00:15:56 【问题描述】:我有两张桌子,一张叫做“产品”,一张叫做“图片”。 表格“图片”包含每个产品的图片,所以每个产品我可以有 5 张图片。
我想选择只为每个产品检索 1 张图片。我是新加入的,所以我不知道如何解决这个问题。
我正在尝试:
SELECT *
FROM products
INNER JOIN images ON products.id=images.prod_id
WHERE products.cat='shoes'
我需要在图像表上添加一个限制 0,1。我该怎么做?
提前致谢。
【问题讨论】:
您有图片的 ID 号吗?如果您保证图像编号为 0 - 4,则添加 WHERE images.ID = 0 或类似的东西。 【参考方案1】:也许在这里子选择是一个更好的解决方案。
类似这样的:
SELECT
productId,
productName,
(SELECT imageData FROM Image i WHERE i.productId = productId LIMIT 1) AS imageData
FROM Products
【讨论】:
【参考方案2】:最好避免子查询,因为它们在 mysql 中很慢。
如果您想获取与产品相关的任何图片, 您可以快速但不是很好的方式做到这一点:
SELECT *
FROM products
INNER JOIN images ON products.id=images.prod_id
WHERE products.cat='shoes'
GROUP BY products.id
如果您想获得第一张图片(根据任何标准),请应用groupwise max 技术
【讨论】:
谢谢!它似乎工作正常......无论如何我不明白如何使用groupwise。我将尝试更好地解释我的查询需要做什么:从“鞋子”类别中获取所有产品,并获取“鞋子”类别中每个产品的第一张图片。【参考方案3】:看看DISTINCT
【讨论】:
DISTINCT 不起作用,因为每个图像都有一个唯一的值【参考方案4】:这里的关键是correlated subqueries。
select
*
from
products p,
(
select
*
from
images i
where
i.prod_id = p.id
limit 1
) as correlated
where
p.cat = 'shoes'
【讨论】:
我不相信派生表/内联视图可以利用相关性 - 我希望此查询返回错误,或者每个产品只返回相同的图像记录。并且相关性仅适用于返回的图像 - 没有实际的连接标准,因此结果将是笛卡尔积...... +1:如果没有相关的子查询,世界将是一个如此黑暗和无情的地方。 @OMG Ponies - 你可能是对的,我不确定,我面前没有数据库。在这种情况下,将相关性移入select
子句以获得相同的结果。
@OMG - 哦,关于笛卡尔积。相关查询只返回 1 行,所以,这真的没问题。【参考方案5】:
SELECT * FROM products
LEFT JOIN images ON products.id=images.prod_id
WHERE products.id='1' LIMIT 1
这将返回为您的产品找到的第一张图片以及所有产品详细信息。
如果您想检索多个产品,那么我建议您进行 2 次查询。
SELECT product data
Loop through product data
SELECT image data LIMIT 1
执行复杂的单个查询通常最终会比几个/几个较小的查询更昂贵。
【讨论】:
此查询只选择一种产品,而不是每个产品一张图片。 这只会返回一个产品,因为limit
被应用于最外层的查询。以上是关于INNER JOIN:第二张表的限制为 0,1的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 双表 INNER JOIN , LEFT JOINED 到第三张表,只有一行具有最低值