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的主要内容,如果未能解决你的问题,请参考以下文章

sql中怎么才能实现两张表 数据自动匹配

oracle 连接

MySQL 双表 INNER JOIN , LEFT JOINED 到第三张表,只有一行具有最低值

MySQL Inner Join 有限制吗?

表的基本查询语句及使用连表(inner joinleft join)子查询

sql中的inner join ,left join ,right join