-1

次のようなdbテーブルがあります。

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

foreach ループでクエリを実行している php があります。

$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);
}

$tag 値として 1 を使用する最初のクエリは product_id 1 と 2 をプルし、$tag として 3 を使用する 2 番目のクエリは product_id 1 を再びプルします。

以前に product_id が返されていない場合にのみ、クエリが行を返すようにします。product_id が一意の場合にのみ結果を表示したい。これを行う方法はありますか?

私は DISTINCT がこれを達成すると思っていましたが、うまくいかないようです。

4

2 に答える 2

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 ごとに 1 つの行が必要です」です。「商品ごとに複数の 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
于 2013-05-20T20:43:07.047 に答える
1

さて、おそらくGROUP BYが必要です。以下が実際に何を意味するのかよくわかりません。テーブルにある種の日付列があるように見せかけています。

「以前に product_id が返されていない場合にのみ、クエリが行を返すようにしたい。」

これを無視して、現在のデータが次のとおりであり、心配する追加の列がないことを前提としています。

商品タグ ID | タグ ID | 製品番号
      1 1 1
      2 1 2
      3 3 1

しかし、あなたはこれを返したい:

商品タグ ID | タグ 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
于 2013-05-20T20:41:53.823 に答える