2010-07-05 40 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