2013-05-20 73 views
-1

我有一個數據庫表,看起來像這樣:只返回一行,如果結果是唯一

product_tag_id | tag_id | product_id 
     1   1   1 
     2   1   2 
     3   3   1 

我有一些PHP的是正在運行在foreach循環查詢:

$product_tags = [1,3]; 
foreach(product_tags as $tag) { 
    $q = $this->db->query("SELECT product.*, product_tags.* FROM product 
    INNER JOIN product_tags ON product_tags.product_id = product.product_id 
    WHERE product_tags.tag_id =" . $tag); 
} 

第一使用1作爲$ tag值的查詢會拉取product_id 1和2,第二個查詢使用3作爲$ tag再次拉取product_id 1。

我只希望查詢返回一行,如果它之前沒有返回product_id。如果product_id是唯一的,我只想查看結果。有沒有辦法做到這一點?

我認爲DISTINCT會爲我實現這個目標,但它似乎並不奏效。

+2

你真的需要所有這些列嗎? – Ben

+0

您可以添加更多樣本數據並提供您想要的最終結果。它是MySql和PHP嗎? –

+0

@ben:你的意思是,我是否需要選擇所有這些列,還是我真的需要在我的數據庫結構中的所有3列? –

回答

1

好的,你可能需要一個GROUP BY。我不確定以下內容的真實含義,你可以看起來好像你在表格中有某種日期列。

「我只希望查詢返回一行,如果它之前沒有返回product_id。」

我會忽略這一點,假設當前數據如下,你有沒有其他列擔心:

 
product_tag_id | tag_id | product_id 
     1   1   1 
     2   1   2 
     3   3   1 

,但要返回此:

 
product_tag_id | tag_id | product_id 
     1   1   1 
     3   3   1 

即你想每個標籤最少PRODUCT_ID。所以,你應該選擇:

SELECT pt.product_tag_id, pt.tag_id, min(p.product_id) as product_id 
    FROM product 
INNER JOIN product_tags pt 
    ON pt.product_id = p.product_id 
WHERE pt.tag_id = ? 
GROUP BY pt.product_tag_id, pt.tag_id 
+0

謝謝 - 我已經意識到了這個問題。這基本上是我之後的事情,但是我所問的問題存在問題。看到我對Mike的回答 –

+0

@Mike,使用數據庫比使用PHP更快。如果你可以在數據庫中做到這一點,那就這樣做。 – Ben

1

包括你的問題DDL將總是讓你更多更好的答案。

create table products (
    product_id integer primary key, 
    product_name varchar(15) unique 
); 

create table product_tags (
    product_tag_id integer primary key, 
    tag_id integer not null, 
    product_id integer not null, 
    unique (tag_id, product_id) 
); 

insert into products values (1, 'a'), (2, 'b'), (3, 'c'); 
insert into product_tags values (1, 1, 1), (2, 1, 2), (3, 3, 1); 

我只希望查詢返回一行,如果它之前沒有返回PRODUCT_ID。

另一種說法是,「我想每個product_id有一行」。我們不得不問,「那麼當每個產品有多個tag_id時,您需要哪個tag_id?」在這裏,我返回最小tag_id。

select products.product_id, products.product_name, tags.min_tag_id 
from products 
inner join 
    (select product_id, min(tag_id) min_tag_id 
    from product_tags 
    group by product_id) tags 
    on tags.product_id = products.product_id 
where tags.min_tag_id = 1 
+0

我明白了爲什麼我的問題現在很混亂。我通常很難說清自己並寫出一個明確的問題。我已經意識到我的問題,但似乎沒有人接受它。我正在運行查詢兩次(每個循環都在上面的代碼中運行),所以我所問的是不可能的。對於上面的代碼,每個循環運行兩次,因此無法使用mysql來限制結果。我的噓聲......漫長的一天 –