【问题标题】:INNER JOIN: limit 0,1 on the second tableINNER JOIN:第二张表的限制为 0,1
【发布时间】: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 或类似的东西。

标签: php mysql inner-join


【解决方案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 被应用于最外层的查询。
    猜你喜欢
    • 2014-10-31
    • 2014-06-03
    • 2013-03-02
    • 2013-01-25
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多