2010-07-05 42 views
3

我有两张桌子,一张叫做“产品”和一张“图片”。 表格“图像”包含每个产品的图像,因此每个产品可以有5个图像。INNER JOIN:在第二张桌子上限制0,1

我想做一个选择,每个产品只回收1张图片。我新来加入,所以我不知道如何解决这个问题。

我与努力:

SELECT * 
     FROM products 
INNER JOIN images ON products.id=images.prod_id 
    WHERE products.cat='shoes' 

我需要添加图像表限价0,1。我如何做到这一点?

在此先感谢。

+0

您是否有图像的ID号?如果你保证图像编号为0 - 4,然后添加WHERE images.ID = 0或类似的东西。 – Kyra 2010-07-05 17:50:18

回答

3

最好避免子查询,因为它们在mysql中很慢。

如果你想获得相关产品的任何图像, 你能做到这一点的快,但不是很好的方式:

SELECT * 
FROM products 
INNER JOIN images ON products.id=images.prod_id 
WHERE products.cat='shoes' 
GROUP BY products.id 

如果你想获得第一图像(通过任何标准),适用groupwise max技术

+0

谢谢!它似乎工作正常...无论如何,我不明白如何使用groupwise。 我会尽力解释我的查询需要做什么: 获得“鞋类”类别中的所有产品,并获得“鞋子”类别中每个产品的拳头形象。 – Luciano 2010-07-05 18:54:59

7

也许子查询是一个更好的解决方案。

事情是这样的:

SELECT 
productId, 
productName, 
(SELECT imageData FROM Image i WHERE i.productId = productId LIMIT 1) AS imageData 
FROM Products 
0
+1

DISTINCT不起作用,因为每个图像将具有唯一值 – 2010-07-05 18:26:24

-1
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 
} 

执行复杂的单个查询通常最终会比两个/几个较小的查询花费更多。

+0

此查询仅选择一个产品,而不是每个产品的一个图像。 – erenon 2010-07-05 17:51:33

+0

这只会返回单个产品,因为'limit'正被应用于最外层的查询。 – Donnie 2010-07-05 17:51:58

0

这里的关键是correlated subqueries

select 
    * 
from 
    products p, 
    (
    select 
    * 
    from 
    images i 
    where 
    i.prod_id = p.id 
    limit 1 
) as correlated 
where 
    p.cat = 'shoes' 
+0

我不相信派生表/内联视图可以利用相关性 - 我期望这个查询返回一个错误,或者每个产品只有相同的图像记录。并且相关性仅适用于返回的图像 - 没有实际的加入标准,因此结果将是笛卡尔积... – 2010-07-05 18:28:31

+0

+1:世界将是一个如此黑暗而又无情的地方,没有相关的子查询。 – manneorama 2010-07-05 18:28:55

+0

@OMG小马 - 您可能是对的,我不确定,在我面前没有数据库。在这种情况下,将相关性移入'select'子句以获得相同的结果。 – Donnie 2010-07-05 18:29:59